0

スタイルシート用に独自のウィジェット クラスを有効にしたいのですが、これは ではなく、 qsssetStyleSheet(qss)スタイルシートのセレクターです。名前空間の "::" を "--"に置き換える必要があることは理解されています。

ここ (カスタム ウィジェットの Qt スタイルシート) 同様の質問を見つけましたが、それは 4 年以上前のものです。答えに基づいて、いくつかの詳細な質問があります。

a) https://stackoverflow.com/a/8817908/356726から、オーバーライドされた公開されたアプローチはpaintEventまだ有効ですか(Qt5.6/5.7)

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

b) 同じスレッド ( https://stackoverflow.com/a/22094319/356726 ) で、オーバーライドする必要はないと言われていますpaintEvent。わかりました、私に導きます:b1)paintEventとにかくオーバーライドするのは有害QFrameですか?b2) 他の基本クラスとは何QTableViewですか? QFrameこの特定の役割を持つ理由は何ですか?

c)そのトピックに関する公式の Qt ドキュメントを見つけた人はいますか? a の素敵なコードですが、それはどこから来たのですか? (ここ) 正直なところ、私はそれが何をするのか理解していません。

- 編集 -

paintEventダニエルは、その魔法のスニペットのソースをここ(QWidget段落)で指摘しています。同じ( 「サポートのみ..」)が に対して言われているのは興味深いことです。QDialogこれは、そこでもスニペットを使用する必要があることを意味する可能性があります。デフォルトでそのスニペットをpaintEventofに追加しない理由がわかりません。QWidget

4

1 に答える 1

3

オーバーライドされた paintEvent を使用した公開されたアプローチはまだ有効ですか (Qt5.6/5.7)

  • はい

同じスレッド ( https://stackoverflow.com/a/22094319/356726 ) では、paintEvent をオーバーライドする必要はないと言われています。わかりました、私に導きます:b1)QFrameを使用しても、とにかくpaintEventをオーバーライドすることは有害ですか?b2) QTableView などの他の基本クラスとは何ですか? QFrame がこの特定の役割を持つ理由は何ですか?

  • サブクラスQFrame化すると、独自のペイント イベントが提供されますQFrameこれは特別なケースではなく、すべてのウィジェットに当てはまります。デフォルトでQWidget::paintEventは何もしません。空っぽです。そのため、サブクラス化するときにスタイルシートを有効にするために、それをオーバーライドして独自のペイントを提供する必要がありますQWidget。の paint イベントをオーバーライドしても害はありませんが、の実装QFrameを呼び出さない限り、デフォルトの動作が失われます。QFrame

そのトピックに関する公式の Qt ドキュメントを見つけた人はいますか。a の素敵なコードですが、それはどこから来たのですか?

  • ここに公式ドキュメントがあります。少し下にスクロールすると、次のように記載されています。background QWidget 、background-clip、および background-origin プロパティのみをサポートします。QWidget からサブクラス化する場合、以下のようにカスタム QWidget に paintEvent を提供する必要があります。

-

void CustomWidget::paintEvent(QPaintEvent *)    
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
于 2016-06-22T08:32:00.340 に答える