2016-02-11 3 views
0

Я работаю с приложением Qt, которое использует XML-файл для создания пользовательского интерфейса через компилятор пользовательского интерфейса Qt.Динамическая таблица стилей Qt с компилятором пользовательского интерфейса

У меня нет доступа к коду, который содержит каждый виджет (я делаю, но компилятор Qt UI перегенерирует его каждый раз), поэтому я не могу добавить другой метод в класс, который он генерирует.

Я пытаюсь сделать setStyleSheet на одном из виджетов QLineEdit, но он дает мне предупреждение 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' предназначен как функтор или указатель на функцию. Передайте ему лямбду с кодом для запуска, и все готово. –

Смежные вопросы