QT重绘/重绘/更新/做某事

时间:2010-01-12 22:23:51

标签: c++ qt refresh

我是QT的新手。我知道你可以强制显示刷新,但我已经把我所有的头发拉出来试图找出方法。这是我特别想要做的事情。

我按下按钮(onClick信号事件),该按钮运行代码以更改显示器上的图像(QLabel),等待输入,然后通过更改新图像(不同的QLabel)继续。我已经尝试了所有内容,直到onclick信号事件代码完成后,显示才会刷新。现在,我不是在等待用户输入,我正在使用usleep(~500 ms)进行测试。

从我读到的内容来看,QT是事件驱动的,这意味着我基本上创建了一堆事件,这些事件被置于一个空闲状态,并在(onClick信号事件)返回(主循环)/(事件)时执行处理程序)。我不想等到函数完成后,如果我必须完全根据事件完成这个例程,那么编程会非常痛苦。

如何强制QLabel pixmap刷新。我已经尝试了一切。下面是我在onClick信号事件处理程序中尝试过的所有代码。 (upButton是QLabel的名称,它是一个pixmap)

update();
repaint();
ui->upButton->setUpdatesEnabled(TRUE);
update();
repaint();
QPaintEvent paintevent(ui->upButton->childrenRegion());
QPaintEvent * test = &paintevent;
paintEvent(test);
this->changeEvent(test);
ui->upButton->update();
ui->upButton->repaint();
ui->upButton->repaint(ui->upButton->childrenRegion());
repaint();
QApplication::sendPostedEvents();
this->parentWidget()->update();
usleep(100000);

正如你所看到的,我现在只是在黑暗中拍摄。我试着查看示例代码并完成所有作业,但我迷路了。感谢任何帮助,建议和/或示例代码。

4 个答案:

答案 0 :(得分:22)

我正在使用睡眠来模拟计算机等待发生事情的短暂时间。

正如我在我的问题中所述,我不想使用事件,因为非常简单地完成某些事情需要做很多不必要的工作。

此外,程序需要继续进行的“事件”是USB事件。由于我正在使用HID类设备,因此无法在没有等待循环的情况下设置事件。 USB HID类不允许设置中断,操作系统声称设备。

我成功地完成了上述工作。我走过调试器,发现显示器会在睡眠功能之前刷新。独立运行程序,我得到了随机结果,显示屏刷新了1%的时间。我摆脱了睡眠功能,并在其中添加了一些其他代码来模拟延迟,这很好。

只是为了每个人的知识,这是可能的,这是不可能的,并且很容易做到以下几点:

qApp->processEvents();

qApp是QApplication标头中的全局外部变量。

因为这个USB事件使我的流程变得棘手,所以我偶然发现了QWaitCondition类。我打算开始一个等待USB事件的进程。我会等到进程释放我的例程的等待条件才能继续。

但如果有人认为这是个坏主意,请说出来。我非常感谢你的反馈PiedPiper和Hostile Fork。

谢谢。

答案 1 :(得分:7)

您不应该等待事件处理程序中的输入。您需要重新考虑程序的逻辑,以按照预期的方式使用事件。如果返回事件循环,则代码中的所有update()和repaint()调用都是不必要的。

答案 2 :(得分:5)

我注意到,当你有多个小部件小部件或小部件内部的小部件时,它会有助于调用他们的repaint()事件。

例如

this->repaint();
this->parentWidget()->repaint();
this->parentWidget()->parentWidget()->repaint();

这比将任何处理推送到另一个线程或创建其他事件处理程序要容易得多。

答案 3 :(得分:2)

如果我理解正确,你有一个插槽,在这个插槽中,你更新QLabel中显示的图像。但是您希望在插槽完成之前显示此更改。

如果是这种情况,请发出update()事件,并调用qApp-> processEvents()。此方法处理在事件队列中等待然后返回的事件,因此这可能是您所追求的。

PS:根本不需要更新(),我不确定。