2017-03-22 32 views
0

我使用C++,Qt 4.8.7,Visual Studio來創建基於GUI的應用程序。我必須添加一些可檢查的按鈕,其中包含帶有標題的字幕。我使用github的第三方按鈕,請參閱richtextpushbutton.hrichtextpushbutton.cpp。選中的QPushButton的默認外觀看起來很糟糕(無法讀取),我想在選中狀態下更改其背景。如何更改以下方法以覆蓋此HTML支持按鈕的選中狀態的背景顏色(當isRichText爲true和false時)?我只見過簡單QPushButton後代的例子(沒有QTextDocument)。如何更改可檢查QPushButton後代的背景顏色?

void RichTextPushButton::paintEvent(QPaintEvent *event) 
{ 
    if (isRichText) { 
    QStylePainter p(this); 

    QRect buttonRect = rect(); 
    QPoint point; 

    QTextDocument richTextLabel; 
    richTextLabel.setHtml(htmlText); 

    QPixmap richTextPixmap(richTextLabel.size().width(), richTextLabel.size().height()); 
    richTextPixmap.fill(Qt::transparent); 
    QPainter richTextPainter(&richTextPixmap); 
    richTextLabel.drawContents(&richTextPainter, richTextPixmap.rect()); 

    if (!icon().isNull()) 
     point = QPoint(buttonRect.x() + buttonRect.width()/2 + iconSize().width()/2 + 2, buttonRect.y() + buttonRect.height()/2); 
    else 
     point = QPoint(buttonRect.x() + buttonRect.width()/2 - 1, buttonRect.y() + buttonRect.height()/2); 

    buttonRect.translate(point.x() - richTextPixmap.width()/2, point.y() - richTextPixmap.height()/2); 

    p.drawControl(QStyle::CE_PushButton, getStyleOption()); 
    p.drawPixmap(buttonRect.left(), buttonRect.top(), richTextPixmap.width(), richTextPixmap.height(),richTextPixmap); 
} else 
    QPushButton::paintEvent(event); 
} 

QStyleOptionButton RichTextPushButton::getStyleOption() const 
{ 
QStyleOptionButton opt; 
opt.initFrom(this); 
opt.features = QStyleOptionButton::None; 
if (isFlat()) 
    opt.features |= QStyleOptionButton::Flat; 
if (menu()) 
    opt.features |= QStyleOptionButton::HasMenu; 
if (autoDefault() || isDefault()) 
    opt.features |= QStyleOptionButton::AutoDefaultButton; 
if (isDefault()) 
    opt.features |= QStyleOptionButton::DefaultButton; 
if (isDown() || (menu() && menu()->isVisible())) 
    opt.state |= QStyle::State_Sunken; 
if (isChecked()) 
    opt.state |= QStyle::State_On; 
if (!isFlat() && !isDown()) 
    opt.state |= QStyle::State_Raised; 
if (!isRichText) 
    opt.text = QPushButton::text(); 
opt.icon = icon(); 
opt.iconSize = iconSize(); 
return opt; 
} 
+0

爲什麼」只需在['clicked'](http://doc.qt.io/qt-5/qabstractbutton.html#clicked)或['toggle []](http://doc.qt。 io/qt-5/qabstractbutton.html#切換)信號被髮射? –

回答

1

去的方式是使用樣式表。正如您在getStyleOption()中看到的,當檢查按鈕對應於僞狀態:on時,將設置狀態QStyle::State_On。在按鈕的情況下,僞狀態:checked也可以應用。

QStyle :: State_Off 0x00000008用於指示是否檢查小部件不是 。

QStyle :: State_On 0x00000020用於指示是否檢查小部件 。

所以你的樣式看起來是這樣:

RichTextPushButton:checked { 
    background-color: red; 
} 

如果您isRichText變量是一個動態屬性(的QObject ::屬性),你可以限制你的樣式表進一步:

RichTextPushButton[isRichText="true"]:checked { 
    background-color: red; 
} 
+0

謝謝,我已經試過了你的樣式表,但顏色不固定(紅色與灰色混合)。 – ilya

+0

加入'border:none;'解決了它http://stackoverflow.com/questions/24718722/how-to-style-qpushbuttons-checked-state-to-remove-grey-dots – ilya

2

選中QPushButton的默認外觀看起來可怕

這就是爲什麼很多的Qt年前推出樣式表。 Check this out

要更改推按鈕的背景顏色簡單地做:

void MyClass::slotToggleButton(bool enable) 
{ 
    m_pushButton->setStyleSheet(enable ? "background: green;" : ""); 
} 
+0

謝謝,我使用過樣式表,但我不知道混合方法的可能性(混合自定義'paintEvent'和'setStyleSheet')。 – ilya

+0

但是,如果我爲RichTextPushButton('isRichText == true')使用HTML模式,那麼字體樣式將被忽略。 – ilya