带有用户界面编译器的Qt动态样式表

Qt dynamic stylesheet with User Interface Compiler

本文关键字:动态 样式 Qt 用户界面 编译器      更新时间:2023-10-16

我正在使用一个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);
}