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

时间:2016-02-11 20:20:49

标签: c++ qt

我正在使用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

我该怎么做才能解决这个问题?我需要动态更改窗口小部件的样式表,但似乎无法以任何方式执行此操作。

1 个答案:

答案 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);
}