2016-02-11 30 views
0

我正在使用Qt应用程序,它使用XML文件通过Qt用户界面编译器生成用户界面。Qt动态样式表与用户界面编译器

我无法访问保存每个窗口小部件的代码(但我每次都会重新生成它),所以我无法将其他方法添加到它生成的类中。

我正在尝试在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

你在主线程(在一个地方'QApplication'实例启动)时你尝试应用样式表? – jpo38

+1

我不是。它在一个单独的线程中。它允许我通过'setText(“text”)改变文本的值,但是我无法设置样式表。 –

+0

没有惊喜然后,如果它崩溃,检查库巴的答案 – jpo38

回答

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); 
} 
+0

我试图通过链接回答,并且似乎无法理解如何设置信号/插槽。 如果我需要设置一个信号发送到主线程来更新样式表,我该怎么做呢? 我理解信号和插槽的概念,并理解如何连接它们。我的问题是为QLineEdit(或任何小部件)制作一个。似乎没有任何信号可以用来发送到setStyleSheet插槽。 –

+0

@JoshJohnson你根本不需要任何信号,这是由例子照顾。你正在执行的是一个函子 - 一个自包含的代码块 - 在主线程中。答案的第一部分有你需要的一切。 'F'模板类型是一个函数或函数指针。将它传递给您的代码的lambda运行,然后就完成了。 –