QGridLayout限制中的多个小部件

时间:2019-11-21 08:19:50

标签: c++ qt qwidget

我尝试像碎片整理软件一样制作自己的小部件来进行块扫描。 我现在遇到了QT中的小部件限制问题。

我目前的做法是:

r = 200 / c = 83

void QScanBoard::setupLayout()
{

    this->setAttribute(Qt::WA_LayoutUsesWidgetRect);
    this->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

    gridTable = new QGridLayout;

    gridTable->setSpacing(0);
    gridTable->setMargin(0);
    gridTable->setContentsMargins(0, 0, 0, 0);
    gridTable->setSizeConstraint(QLayout::SetFixedSize);

    this->setLayout(gridTable);
}

void QScanBoard::createTiles()
{
    for (unsigned int r = 0; r < m_numRows; ++r)
    {
        m_tiles += QList<QScanTile*>{};
        for (unsigned int c = 0; c < m_numCols; ++c)
        {
            // add a new tile to the row
            m_tiles[r] += new QScanTile({ r, c }, this);
            gridTable->addWidget(m_tiles[r][c], r, c);

        }
    }
    m_tiles[0][0]->setDown(true);

}

QScanTitle是一个QPushButton或QLabel作为示例。我使用QGridLayout将此小部件放置在对话框(小部件)上。

如果我现在使用200/83,则速度足够快。如果尝试设置2000/83,软件将挂起。这意味着带有166000个小部件的太多。但是有时候我需要更多。

有人知道如何管理吗?因为一个小部件只能有一个父级,所以我不能多次添加一个QPushButton,所以我需要为每个QGridLayout单元创建一个新的。

我可以设置QGridLayout而不在单元格内放置任何小部件吗?只是背景色?

1 个答案:

答案 0 :(得分:0)

如评论中所述,QWidget将为此目的“沉重”一个对象。尽管注释中的QGraphicsScene / QGraphicsView组合也将起作用,但是创建成千上万个对象的简单事实将花费大量时间。我在QGraphicsScene机制上进行了广泛的研究,并且在许多方面都很棒,但这听起来像是一个相当简单的网格图,似乎并不需要QGraphicsScene / QGraphicsView的额外复杂性。

我建议您创建一个从QWidget派生的新窗口小部件,而不是在网格中创建子窗口小部件,只需自己绘制即可。对于简单的平铺模式,这并不是很难做到的,它比创建单个对象快很多倍。您必须重写QWidget :: paintEvent,然后在此处创建绘画代码。您需要查看QPainter类。

如果用户将以某种方式与各个图块进行交互,那么您还需要对这些交互进行编码。例如,您的自定义窗口小部件无需执行对当前方法中对QPushButton单击的响应,而是需要处理鼠标事件并使用鼠标事件坐标来确定用户单击了哪个图块。然后,您可以使用该信息来做所需的任何事情。