我正在使用Qt应用程序,该应用程序使用XML文件通过Qt用户界面编译器生成用户界面。
我无法访问包含每个小部件的代码(我这样做,但每次都会重新生成Qt UI编译器),因此我无法在其生成的类中添加其他方法。 / p>
我正在尝试在其中一个QLineEdit小部件上执行setStyleSheet,但它会给我QPixmap: It is not safe to use pixmaps outside the GUI thread
警告,然后最终出现seg错误。在让自己无法走这条路线后,我决定测试每个小部件的两个副本,每个副本都需要样式表值。然后,我会根据需要在小部件上触发QLineEdit::hide()
和QLineEdit::show()
,我认为这样可行。
没有。程序现在每当运行时都会吐出QCoreApplication::sendPostedEvents: Cannot send posted events for objects in another thread
。
我该怎么做才能解决这个问题?我需要动态更改窗口小部件的样式表,但似乎无法以任何方式执行此操作。
答案 0 :(得分:1)
您不能从主线程以外的线程调用任何QWidget
方法。但是,从任何线程安全地间接调用此类方法相当容易。有关详细信息,请参阅this answer。
例如,假设您想在窗口小部件上调用setStyleSheet
,而不是在其他线程中运行的代码:
template <typename F>
static void postToMainThread(F && fun, QObject * object) {
QObject signalSource;
QObject::connect(&signalSource, &QObject::destroyed, object, std::forward(fun));
}
void threadCode(QWidget * widget) {
postToMainThread([widget]{
widget->setStyleSheet("color: black");
}, widget);
}