0

我的 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”完成,主窗口才会显示,我找不到如何在每个循环中显示主窗口。

谁能给我任何建议?

4

2 回答 2

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 添加到您的“.pro”文件中。如果您想更好地理解事物,我建议您阅读有关 qt 事件的内容。

于 2014-05-09T14:10:47.263 回答
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);
    }        
}
于 2014-05-07T08:33:35.300 回答