Qt,如何在每个循环步骤

时间:2018-04-03 14:30:52

标签: c++ qt loops user-interface

我的主要看起来像这样:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Window window(&a);

    return a.exec();
}

Window类有一个方法move(),如下所示:

void Window::move()
{

    const int STEPS_AMOUNT = 10;
    const int STEP = 1000;
    for (int i = 0; i < STEPS_AMOUNT; i++)
    {
        for (int j = 0; j < STEP; j++)
        {
            for (int k = 0; k < SQUARES_AMOUNT; k++)
            {
                for (int l = 0; l < SQUARES_AMOUNT; l++)
                {
                    int r = qrand() % 2;
                    if (r == 0)
                        r = -1;
                    board[k][l] = r;
                }
            }
            QApplication::processEvents(QEventLoop::AllEvents);
            app->processEvents(QEventLoop::AllEvents);
        }
    }
}

而我每次都想画我的电路板&#34; j&#34;增加。 为此,我创建了这个方法:

void Window::paintEvent(QPaintEvent *e)
{
    Q_UNUSED(e);

    for (int k = 0; k < SQUARES_AMOUNT; k++)
        for (int l = 0; l < SQUARES_AMOUNT; l++)
        {
            if (board[k][l] == 1)
                draw(k, l);
        }
}

我想到了这两行之一:

        QApplication::processEvents(QEventLoop::AllEvents);
        app->processEvents(QEventLoop::AllEvents);

将根据processEvents():

的定义工作
  

根据以下内容处理调用线程的所有挂起事件   指定的标志,直到没有更多的事件要处理。

但它没有用。怎么办?我不想用时间步更新GUI。

1 个答案:

答案 0 :(得分:0)

自从我完成任何Qt开发以来已经有一段时间了。这样做的Qt方法是使用信号和插槽。请查看post以获取示例。

Qt文档为here

总结一下,您将connect数据源添加到窗口小部件(如果窗口小部件无法直接显示该类型,则为包装器)。这是在您的设置过程中完成的。

然后在运行时,调用emit会导致连接触发。

每次刷新时,您还需要执行update之类的操作。如果您只是向窗口小部件发送1000个不同的字符串,那么我不会认为UI会显示每个字符串。