0

Class在 Qt 中有一个 GUI C++,它有一个SLOTQGridLayout. 该数组是正方形的,取决于变量 say n。即如果n == 10那么有10x10 QTextbox&QLabelQGridLayout. 基本上,当用户按下“增加”按钮时, 的值n会增加 1 & 相应地QTextbox&QLabel被创建在SLOT& 添加到QGridLayout. 当值为nis15时,更新 GUI 需要1-2 。但是,当我使用它时QTimeSLOT它告诉我实际执行时间SLOT约为100 ms。而在我观察到的调试QDebug模式用于打印经过的时间,即使 GUI 没有针对更高的n. 我想知道为什么会有这么多延迟以及执行之后运行的内容,SLOT以便我可以测量相同的时间。我希望我说清楚了。如果您不能理解我的问题,请告诉我。谢谢你。

实际上,我现在没有确切的代码。因此,我创建了一个示例代码,突出显示了我的代码逻辑。请忽略任何语法错误,因为我已经尽快准备好了。很抱歉:(所以这里是代码片段:

Class A
{
private:
    int n;
    QList <QLabel *> *labelList;
    QList <QTextEdit *> *textList;
    QGridLayout *inp;

    public slots:
        updateGUI();
}

A::updateGUI()
{
    QTime t;
    t.start();

    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
                            int even = j%2;
            QLabel *tempLab = new QLabel();
            //some stuff for initialisation of the QLabel
            QTextEdit *tempText = new QTextEdit();
            //some stuff for initialisation of the QTextEdit
            labelList->append(tempLab);
            textList->append(tempText);
                            if(even == 0)
                inp->AddWidget(tempLab, i, j, 5, 5, Qt::AlignCenter);
            else
                                inp->AddWidget(tempText, i, j, 5, 5, Qt::AlignCenter);
        }
    }

    QDebug("%d", t.elapsed());
}

PS:QTime tobj.start()是第1行,SLOT&QDebug("%d", tobj.elapsed())SLOTOfcourse的最后一行!

4

3 回答 3

2

当您对小部件进行批量更新时,请关闭updatesEnabled 属性。当您添加 (11*11-10*10) 个新按钮时,这可以防止 21 次单独更新。

于 2013-02-13T12:02:59.960 回答
1

如果您发布一些具有相同问题的代码,这真的会有所帮助。当您选择让我们说 n=10 然后 n=7 时,您的插槽将如何反应?它会从布局中删除最后 3 个项目吗?如果你选择 n=7 然后 n=10,它会尝试只添加最后 3 行吗?您是否有可能没有从布局中删除项目并尝试在现有项目上添加新项目?

如果是这样 - 那么您可以使用以下命令从布局中删除所有小部件:

QLayoutItem* item;
while ( ( item = %your_layout_name%->takeAt( 0 ) ) != NULL ){
    delete item->widget();
}
delete item;

或者您可以通过它的对象名称删除小部件(或通过句柄,存储在 QList QVector 或其他东西中):

swLayout->removeWidget(myTextEdit);

UPD:现在,我们有一些代码,您还需要清除 labelList 和 textList,如果我是正确的,它们存储句柄。然后,线

inp->AddWidget(tempLab, i, j, 5, 5, Qt::AlignCenter);
inp->AddWidget(tempText, i, j, 5, 5, Qt::AlignCenter);

尝试将 tempLab 小部件添加到具有 5 高度和宽度的位置 (i,j) 的布局 inp,然后您尝试将另一个小部件 tempText 添加到同一位置,这显然是错误的

接下来,循环本身是不正确的:

for(int i = 0; i < n; i++)
{
    for(int j = 0; j < n; j++)
    {

是你做一个这样的循环,那么你将添加这样的小部件:

inp->AddWidget(tempLab, i, 0, 5, 5, Qt::AlignCenter);
inp->AddWidget(tempLab, i, 1, 5, 5, Qt::AlignCenter);
inp->AddWidget(tempLab, i, n, 5, 5, Qt::AlignCenter);

但是您将小部件的宽度和高度设置为 5,因此您需要以另一种方式添加小部件,否则它们将相互重叠:

inp->AddWidget(tempText, i*5, j*5, 5, 5, Qt::AlignCenter);
于 2013-02-13T12:02:49.843 回答
1

0.1 秒的延迟是因为您正在创建大量小部件,然后将它们添加到网格中(每次添加小部件时,这显然有开销,其他单元格的尺寸必须随着事物的“洗牌”轮次而更新)。

那么为什么在计时器之后进一步延迟呢?插槽生成的所有绘制和调整大小事件现在都已放入事件队列中,在您的插槽执行时该队列已停止。一旦您的插槽完成,所有这些任务都需要处理。

除了其他人所说的之外,您正在做的事情有两个基本缺陷:

  • 删除所有现有的小部件以添加可能的单个小部件。我认为我不需要解释这是多么低效......
  • 如果您已经设法在网格中向用户显示了100多个文本框和标签,那么您的 UI 就失败了。 您需要想出一种更好的方法来允许用户与所有这些数据进行交互。
于 2013-02-13T14:43:32.420 回答