【问题标题】:QWidget's background applied to all its QWidget childrenQWidget 的背景应用于其所有 QWidget 子级
【发布时间】:2016-05-17 23:53:03
【问题描述】:

我选择使用 Qt 来管理我正在处理的项目的 GUI。

在我的QWidget底部找到如何应用图片后,我注意到它对添加到其中的所有组件都有影响。

无论通过setStyleSheet 方法应用什么样式,甚至使用QPixmap,这些元素的背景始终是为QWidget 容器定义的图像。

如何避免这种行为?

这是我的代码:

MainMenu::MainMenu(QWidget* Parent, const QPoint& Position, const QSize& Size) : QWidget(Parent) {

    QString qwidgetStyle = "QWidget {background-image: url(background.jpg); border: 5px solid rgba(3, 5, 28, 1);}";
    QString buttonStyle = "color: rgba(73, 123, 176, 1); font-size:30px; background-color: rgba(73, 123, 176, 1);";

    move(Position);
    resize(Size);   
    setStyleSheet(qwidgetStyle);

    // Menu title
    QLabel *title = new QLabel(this);
    title->setText("Menu");
    title->setStyleSheet(buttonStyle);
    title->setAlignment(Qt::AlignCenter);

    // Menu buttons
    // Play
    buttonPlay = new QPushButton("Play");
    (*buttonPlay).setEnabled(true);
    (*buttonPlay).setStyleSheet(buttonStyle);
    connect(buttonPlay, SIGNAL(clicked()), this, SLOT(handleButton()));
    // Option
    buttonOptions = new QPushButton("Options", this);
    (*buttonOptions).setEnabled(true);
    (*buttonOptions).setGeometry(250, 175, 100, 50);
    (*buttonOptions).setStyleSheet(buttonStyle);
    connect(buttonOptions, SIGNAL(clicked()), this, SLOT(handleButton()));
    // Quit
    buttonQuit = new QPushButton("Quit", this);
    (*buttonQuit).setEnabled(true);
    (*buttonQuit).setGeometry(250, 275, 100, 50);
    (*buttonQuit).setStyleSheet(buttonStyle);
    connect(buttonQuit, SIGNAL(clicked()), this, SLOT(handleButton()));

    // Layout
    QGridLayout *layout = new QGridLayout;
    layout->setMargin(50);
    layout->addWidget(title, 0, 0, 1, 5);
    layout->addWidget(buttonPlay, 3, 1, 2, 3);
    layout->addWidget(buttonOptions, 4, 1, 2, 3);
    layout->addWidget(buttonQuit, 5, 1, 2, 3);
    setLayout(layout);

    show();
}

【问题讨论】:

  • this 有帮助吗?似乎建议在样式表中使用小部件的名称并使用setObjectName 方法。
  • 你愿意写一个答案@PaulRooney 吗?这实际上是解决方案
  • @AlexisP。如果你愿意,请回答。我现在真的没有时间做一个正确的答案。
  • 我希望这个答案能满足你作为评论员的期望:p
  • 为了更好地阅读,我建议您使用恒定的编码风格。一旦你使用title->setText("Menu");,有时使用(*buttonPlay).setEnabled(true);,如果你只使用buttonPlay->setEnabled(true);,就会更容易阅读:)

标签: c++ qt qtstylesheets qt5.6


【解决方案1】:

由于以下几行,您遇到的行为完全正常:

QString qwidgetStyle = "QWidget {background-image: url(background.jpg); border: 5px solid rgba(3, 5, 28, 1);}";
...
setStyleSheet(qwidgetStyle);

在这里,您刚刚告诉 Qt 将 qwidgetstyle 应用于应用程序的每个 QWidget,并使用关键字 QWidget。这就是为什么在 Qt 中,如果您想为这个特定对象应用样式,最好为您的对象设置一个名称。

在您的代码中,QLabel 和 QPushButton 都继承自 QWidget,因此它们将具有您为 QWidget 定义的样式,除非您为它们命名或为每个指定样式。

如果你想为你的MainMenu 设置样式表,它直接继承自QWidget(这是你首先要做的),你必须设置一个名称,然后应用样式:

setObjectName("MainMenu");
QString qwidgetStyle = "QWidget#MainMenu {background-image: url(background.jpg); border: 5px solid rgba(3, 5, 28, 1);}";
setStyleSheet(qwidgetStyle);  // here, only your MainMenu will have the style "qwidgetstyle"

请注意,例如,您可以为每个 QWidget 设置相同的样式表,并且只为您的 MainMenu 添加特定颜色:

// this is in a CSS, but you can apply it directly from the MainMenu constructor of course
QWidget, QWidget#MainMenu {
    background-image: url(background.jpg); 
    border: 5px solid rgba(3, 5, 28, 1);
} // aplied to all QWidget

QWidget#MainMenu { 
    color : #9b9b9b; // a nice grey, only applied to MainMenu
}

再次强调,在使用样式表时要特别注意,否则您的应用程序中到处都会出现奇怪的颜色/对齐方式 :)。希望对您有所帮助!

注意:您也可以感谢@PaulRooney,他在 cmets 中提供了一个非常好的链接。

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2012-07-26
    • 2011-02-03
    • 1970-01-01
    • 2020-04-21
    • 2023-03-22
    相关资源
    最近更新 更多