如何在mainwindow.cpp中的每个循环更新QT Mainwindow

时间:2014-05-07 07:37:54

标签: qt loops mainwindow

我的main.cpp看起来像这样:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

在我的mainwindow.cpp中我希望在“while”的每个循环中显示不同的图像,所以它看起来像这样:

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    image = load_an_image
    int i=0;
    while (i<15)
    {
        show image in the MainWindow
        waitkey (wait until I press a key or wait some time)
        do something to this image for the next loop
        i++
    }
}

然而,主窗口在“while”完成之前不显示,我找不到如何在每个循环中显示MainWindow。

有人可以给我任何建议吗?

2 个答案:

答案 0 :(得分:2)

在gui线程没有其他任务之前,GUI不会自动更新。但是,您可以使用

强制它
qApp->processEvents();

以下是非常糟糕的编码风格的例子,但这可能就是你想要的。

#include "mainwindow.h"
#include <QApplication>
#include <thread>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    qint8 k = 15;

    using namespace Qt;

    QPalette pal;
    QColor col = red;

    while (k--)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(250));
        pal.setBrush(w.backgroundRole(), QBrush(col));
        w.setPalette(pal);
        col = col == red ? blue : red;

        qApp->processEvents();
    }
    return a.exec();
}

要运行此功能,您必须将QMAKE_CXXFLAGS + = - std = c ++ 11添加到您的&#39; .pro&#39;文件。 如果你想更好地理解事物,我建议你阅读有关qt事件的信息。

答案 1 :(得分:0)

您可以使用Qtimer延迟处理图像。这样的事情: -

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QTimer::singleShot(5, this, SLOT(timeout());
}

// create as a slot in the MainWindow derived class
void MainWindow::timeout()
{
    image = load_an_image();
    int i=0;
    while (i<15)
    {
        // show image in the MainWindow
        // waitkey (wait until I press a key or wait some time)
        // do something to this image for the next loop
        i++
    } 
}

但是,通过加载第一个图像然后对关键事件做出反应,而不是直接在主线程中等待,可以更好地处理......

void MainWindow::keyReleaseEvent(QKeyEvent* keyEvent)
{
    if(keyEvent->key() == Qt::Key_Space) // use the space bar, for example
    {
        if(m_imageFrame < 15)
        {
             // update the image
        }
    }
    else
    {
        QMainWindow::keyReleaseEvent(keyEvent);
    }        
}