带有用户界面编译器的Qt动态样式表
Qt dynamic stylesheet with User Interface Compiler
我正在使用一个Qt应用程序,该应用程序使用XML文件通过Qt用户界面编译器生成用户界面。
我无法访问保存每个小部件的代码(我可以访问,但Qt UI编译器每次都会重新生成它),因此我无法将其他方法添加到它生成的类中。
我正在尝试在其中一个QLineEdit小部件上做一个setStyleSheet,但它给了我一个QPixmap: It is not safe to use pixmaps outside the GUI thread
警告,然后最终出现了错误。在屈服于无法走这条路之后,我决定测试每个小部件的两个副本,每个副本都有所需的样式表值。然后,我会根据需要触发QLineEdit::hide()
并在小部件上QLineEdit::show()
,我认为这会起作用。
它没有。现在,只要运行时,程序就会吐出QCoreApplication::sendPostedEvents: Cannot send posted events for objects in another thread
。
我该怎么做才能解决这个问题?我需要动态更改小部件的样式表,但似乎无法以任何方式这样做。
不能从主线程以外的线程调用任何QWidget
方法。但是,从任何线程安全地间接调用此类方法相当容易。有关详细信息,请参阅此答案。
例如,假设您想从在其他线程中运行的代码调用小部件上的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);
}