QGridLayout 限制中的多个小部件

Multiple Widgets in QGridLayout limitation

本文关键字:小部 QGridLayout      更新时间:2023-10-16

我尝试制作自己的小部件,像碎片整理软件一样进行块扫描。 我现在遇到了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 吗?只是背景颜色?

正如评论中提到的,QWidget是"重"一个用于此用途的对象。虽然评论中的QGraphicsScene/QGraphicsView组合也可以工作,但创建数十万个对象的简单事实将花费大量时间。我广泛使用QGraphicsScene机制,在很多方面,它都很棒,但这听起来像是一个相当简单的网格绘图,似乎不需要QGraphicsScene/QGraphicsView的额外复杂性。

我建议你创建一个新的小部件,派生自QWidget,而不是在网格中创建子小部件,你自己绘制它们。对于简单的平铺图案,这并不难做到,而且比创建单个对象快很多倍。你必须覆盖QWidget::p aintEvent,并在那里创建你的绘画代码。您需要查看 QPainter 类。

如果用户将以某种方式与各个磁贴进行交互,则还需要对这些交互进行编码。例如,自定义小部件需要处理鼠标事件并使用鼠标事件坐标来确定用户单击的磁贴,而不是在当前方法中实现对 QPushButton 单击的响应。然后,您可以对这些信息执行任何需要的操作。