QGridLayout addWidget (CustomWidget) не работает - PullRequest
1 голос
/ 06 мая 2019

Я использую QGridLayout в своем коде и хочу добавить свой пользовательский виджет в gridlayout, он не работает с addWidget(CustomWidget*).

Это работает в Windows10 с Visual Studio 2013 и Qt5.6.3.

// *.h
class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = Q_NULLPTR);
private:
    Ui::MainWindow ui;
};

class CustomWidget : public QWidget {
    Q_OBJECT
public:
    CustomWidget(QWidget *parent = Q_NULLPTR) : QWidget(parent) {}
    ~CustomWidget() {}
};

// *.cpp
// when i use CustomWidget
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    ui.setupUi(this);

    QWidget *grid = new QWidget(this);
    grid->setStyleSheet("background:pink;");
    QGridLayout *layout = new QGridLayout(grid);
    layout->setMargin(0);
    layout->setSpacing(0);
    grid->setLayout(layout);
    grid->setGeometry(500, 150, 240, 180);

    // following code is not working, when run this program, 
    // i can only see the 'grid' widget with pink background
    CustomWidget *w = new CustomWidget(grid);
    w->setStyleSheet("background:red;");
    layout->addWidget(w, 0, 0);
}

// but if i use QWidget
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    ui.setupUi(this);

    QWidget *grid = new QWidget(this);
    grid->setStyleSheet("background:pink;");
    QGridLayout *layout = new QGridLayout(grid);
    layout->setMargin(0);
    layout->setSpacing(0);
    grid->setLayout(layout);
    grid->setGeometry(500, 150, 240, 180);

    // following code is working, when run this program, 
    // i can see the 'w' widget with red background
    QWidget *w = new QWidget(grid);
    w->setStyleSheet("background:red;");
    layout->addWidget(w, 0, 0);
}

1 Ответ

1 голос
/ 06 мая 2019

Как сказано в справочнике таблиц стилей Qt, применение стилей CSS к пользовательским виджетам, унаследованным от QWidget, требует переопределения paintEvent() таким образом:

     void CustomWidget::paintEvent(QPaintEvent *)
     {
         QStyleOption opt;
         opt.init(this);
         QPainter p(this);
         style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
     }

Хотя для того, что сказано в документации, без этого ваши пользовательские виджеты будут поддерживать только свойства background, background-clip и background-origin , что может быть ошибкой.

Вы можете прочитать об этом здесь: QtСсылка на таблицы стилей в разделе «Список стилевых виджетов» -> QWidget.

...