我的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。
有人可以给我任何建议吗?
答案 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);
}
}