从Q线程影响Q对话框
Affecting a QDialog From A QThread
我想从一个单独的线程影响一个QDialog,我必须做两件事:
dialog->show();
dialog->raise();
dialog->activateWindow();
据我所知,这些都是事件,因此必须在主线程事件循环中完成。我认为我在QThread::run()
中使用QApplication::postEvent
实现了这一点。有人能证实吗?
其次,我想显示一个在那个单独的线程中处理过的图像。我想我需要将我的对话框类子类化,并编写一个线程安全的setImage()
函数,然后由paintEvent()
调用。。。然而,这似乎是不可能的。我不能用QMutex::unlock()
阻止paintEvent?有人能提出一些建议吗?
QApplication::postEvent(dialog, new QShowEvent());
不起作用。
这是从一个单独的线程调用插槽(作为函数)的解决方案:
QMetaObject::invokeMethod(dialog, "show", Qt::QueuedConnection);
QMetaObject::invokeMethod(dialog, "raise", Qt::QueuedConnection);
仍在研究activateWindow()
和QThread
的安全功能。
因此,对于QImage
来说,它是一个QPaintDevice。据推测它是线程安全的。我的方法是在线程中设置一个类成员QImage
。然后再画。
请注意,以下方法即使不是更好,也是同样好的。
我认为这是一种更清晰的方式来做你想做的事情:
class Dialog : public QDialog
{
...
public slots:
void showImage(QImage img);
...
}
void Dialog::showImage(QImage img);
{
setImage(img);
show();
raise();
activateWindow();
}
class Thread : public QThread
{
...
signals:
void imageReady(QImage);
}
void Thread::run()
{
QImage img;
/// image processing stuff
emit imageReady(img);
...
}
Thread *thread = new Thread;
Dialog *dialog = new Dialog;
connect(thread, SIGNAL(imageReady(QImage)), dialog, SLOT(showImage(QImage)));
thread->start();
相关文章:
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 当对话框被接受时,如何用参数调用槽
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何多次询问来自QML对话框的输入?
- 选择文件对话框错误
- 自定义对话框(源自QDialog)不会关闭(Android)
- 如何在 MFC 对话框中使用 OnDraw
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 从资源视图访问对话框时出现问题
- 如何检测窗口当前是否正在运行模式对话框?
- "最小化"按钮不会出现在 MFC 对话框中
- 如何获取QNetworkConfiguration UserChoice对话框?
- 表单显示对话框函数错误,并且不执行下面的语句
- 如何在 VC6 中的对话框中将图标设置为按钮
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 在 Win32 应用中,如果未选择文件夹并且用户单击"确定",则文件夹选择对话框将关闭
- 在主窗口之前显示登录对话框并隐藏主窗口按钮
- 找不到没有具有类名 #32770 的窗口名称的父窗口的子窗口(对话框)
- 如何在主窗口标签的对话框中显示QLineEdit的输入
- 从Q线程影响Q对话框