Таблица стилей применяется к ячейкам в QGridLayout вместо родительского контейнера

Я унаследовал QWidget, чтобы создать класс под названием (скажем так..) TaskBox.
Я применил QGridLayout к моему TaskBox.
Макет состоит из нескольких QLabels.

Я изменил цвет фона TaskBox, установив для него таблицу стилей.
Теперь это выглядит так:

введите здесь описание изображения

Это то, что я хочу, и я доволен этим.

Проблема в том, что я хочу добавить макрос Q_OBJECT в класс TaskBox. (потому что мне нужно использовать сигналы и слоты)

После добавления макроса Q_OBJECT мои объекты TaskBox становятся такими:

введите здесь описание изображения

Похоже, что таблица стилей разбита на ячейки в QGridLayout.

Вот мой класс TaskBox:

class TaskBox : public QWidget{

Q_OBJECT

public:


    QLabel * title;
    QLabel * description;
    QGridLayout * layout;


   TaskBox(){

       layout = new QGridLayout();

       setRandomColor();   //Function is available below


       title = new QLabel("Something");
       title->setStyleSheet("color:white;");


       description = new QLabel("Something again");
       description->setStyleSheet("color:white;");


       layout->addWidget(title, 0,0);
       layout->addWidget(description,1,0);


       layout->setColumnStretch(0,2);
       layout->setColumnStretch(1,1);

       setLayout(layout);


   }


   void setRandomColor(){

        setStyleSheet("border-radius: 5px;background-color:rgb(" + QString::number((rand() % 255)) + "," + QString::number((rand() % 255)) + "," + QString::number((rand() % 255)) + ");");
   }


};

Я не понимаю, что происходит.
Спасибо за помощь!


person Naveen    schedule 03.08.2014    source источник


Ответы (2)


При создании подкласса QWidget вам необходимо переопределить функцию paintEvent, чтобы заставить таблицы стилей работать правильно.

Вот как вы должны это сделать:

void CustomWidget::paintEvent(QPaintEvent *)
 {
     QStyleOption opt;
     opt.init(this);
     QPainter p(this);
     style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
 }
person thuga    schedule 04.08.2014
comment
Что именно это делает? Мне никогда не требовалось специальное событие paintEvent для использования таблиц стилей. - person tinkertime; 04.08.2014

Попробуйте использовать имена свойств, чтобы устранить двусмысленность того, для чего вы устанавливаете таблицу стилей.

В вашем конструкторе TaskBox:

setProperty("taskbox", true);

А потом:

   void setRandomColor(){

        setStyleSheet("*[taskbox=\"true\"] {border-radius: 5px;background-color:rgb(" + QString::number((rand() % 255)) + "," + QString::number((rand() % 255)) + "," + QString::number((rand() % 255)) + ");}");
   }
person tinkertime    schedule 04.08.2014