2016-02-11 29 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運行,然後就完成了。 –