2016-05-17 33 views
0

我選擇使用Qt來管理我正在開發的項目的GUI。將QWidget的背景應用於所有QWidget子項目

在發現如何在我的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(); 
} 
+0

Does [this](http://www.qtcentre.org/threads/14099-How-to-stop-child-widgets-from-inheriting-parent-s-StyleSheet-and-use-system-default)幫幫我?它似乎建議在樣式表中使用小部件的名稱並使用'setObjectName'方法。 –

+0

你願意寫一個答案@PaulRooney嗎?這實際上是解決方案 – IAmInPLS

+0

@AlexisP。請回答,如果你想。我現在沒有時間做出正確的答案。 –

回答

1

您遇到的行爲是完全正常的,因爲以下行:

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

在這裏,你剛纔講的Qt應用qwidgetstyle每您的應用程序的QWidget,關鍵字QWidget。這就是爲什麼在Qt中,如果您想將樣式應用於此特定對象,最好爲對象設置一個名稱。

在你的代碼,QLabelQPushButton無論從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 
} 

,使用樣式表或者你最終會h當具體在應用程序中隨處可見奇怪的顏色/對齊:)。希望有所幫助!

注意:您還可以感謝@PaulRooney在評論中給出了非常好的鏈接。

+0

真的謝謝你!它奇妙地工作! – MelodyBibi