2017-03-22 1 views
0

GUIベースのアプリケーションを作成するために、C++、Qt 4.8.7、Visual Studioを使用します。チェックマークの付いたボタンを追加する必要があります。キャプションにはサブスクリプトが含まれています。 githubのサードパーティのボタンを使用します(richtextpushbutton.hrichtextpushbutton.cppを参照)。チェックされたQPushButtonのデフォルトの外観はひどい(読めない)ように見えます、私はチェックされた状態でその背景を変更したいと思います。チェック状態(isRichTextが真と偽)の場合、このHTMLサポートボタンの背景色をオーバーライドするために、以下のメソッドを変更するにはどうすればよいですか?私は単純な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)または[' toggled'](http://doc.qt.png)のときに背景色を変更するだけです。 io/qt-5/qabstractbutton.html#toggled)シグナルが放出されますか? –

答えて

1

移動するための方法は、スタイルシートを使用することです。 getStyleOption()にあるように、:on疑似状態に対応するボタンがチェックされているときに状態QStyle::State_Onが設定されています。プッシュボタンの場合には、擬似状態:checkedも適用される。

QStyle :: State_Off 0x00000008ウィジェットが でないかどうかを示すために使用されます。

QStyle :: State_On 0x00000020ウィジェットが であるかどうかを示すために使用されます。

だからあなたのスタイルシートは次のようになります。あなたのisRichText変数は動的プロパティ(QObjectを::プロパティ)であれば

RichTextPushButton:checked { 
    background-color: red; 
} 

あなたは、さらにあなたのスタイルシートを制限することができます。

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

関連する問題