2011-01-28 22 views
5

スタイルシートには奇妙な問題があります。クラスQWidgetの子ウィンドウがあります。スタイルシートを適用して、ウィンドウ全体の背景を理想的にrepeat-xとrepeat-yの画像に変更し、それをタイリングします。Qtスタイルシート。背景色、はい。 background-image、NO

スタイルシート "パイプライン"が機能します。 「背景色」を使用して、赤色と言うように設定すると、ウィンドウ全体が赤く塗られます。しかし、私が背景イメージを使用すると、それはしません。ウィンドウ内でチャイルドウィジェット(Qtデザイナを使用)を追加すると、そのウィジェットの内部だけで、親ウィンドウの上には表示されません。

明らかに私は間違ったことをしていますが、背景色がウィンドウ全体で機能する理由はまったく分かりませんが、子ウィジェットがない限り背景画像は表示されません。それ。

+0

スタイルシートを投稿してください。 Qtスタイルシートのルールは、CSSルールとまったく同じではありません。たとえば、スタイルの範囲を設定するなど、期待しているのとは異なる動作になることがあります。 –

+0

このスタイルシートは、QWidget子孫ウィンドウにすでにQWidget要素があり、ウィンドウ全体ではなく、その要素の領域にのみ存在する場合にのみ、jpegを表示します。 QWidget { 背景画像:url(:/ images/metal-texture.jpg); 背景位置:左上; バックグラウンドリピート:repeat-x repeat-y; /*背景色:赤; */ } – JasonGenX

+0

申し訳ありませんが、私はまだ何が起こっているのかは分かりません。スタイルシートがどの要素に適用されているかを知る必要があります。そして私はあなたのウィジェットの階層についてまだ明確ではありません。あなたは、いくつかのコードを投稿することができるか、多分ASCIIの図や何かを描画することができますか?密集して申し訳ありません...:) –

答えて

0

私のマシンでは以下のコードが正常に動作しています。たぶんあなたはあなたが持っているものと違うところを見ることができますか?それが役に立つと願っています。

#include <QtGui> 

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    QWidget main_window; 
    main_window.setStyleSheet("background-image: url(Chrysanthemum.jpg); " 
          "background-position: top left; " 
          "background-repeat: repeat-xy;"); 
    main_window.show(); 
    return app.exec(); 
} 
+0

私はQT-Designerと* .uiファイルを使用しており、あなたのソリューションは100%プログラムであるという点が唯一の違いだと思います。いずれにしても、メインQWidgetの全領域をカバーする独自の背景を持つ内部ウィジェットを使用することで、その問題を回避することができます。私はあなたの助けに感謝します。 – JasonGenX

+0

また、 'QWidget'のスコープをスタイルシートに適用し、' repeat-xy'の代わりに 'repeat-x repeat-y'を使用しているようです。多分それらのうちの1つが奇妙な行動を引き起こしているのでしょうか? –

+0

スタイルシートの実験で同じWindowsのサンプル画像を選択しました! ;) –

4

これは古い質問のようなものですが、まったく同じ問題を抱えていたため、私はそれを見つけました。

ウィジェットをQWidgetの代わりにQFrameのサブクラスとして作成すると、background-imageプロパティがうまくいくように見えます。また、Daveの例が示すように、「生の」QWidgetを作成しただけでも、うまく動作しているようです。何らかの理由で、QWidgetから派生した新しいウィジェットを作成すると、background-imageは動作しなくなります。

Qt DesignerまたはCreatorでウィジェットを作成した場合、QFrameから派生したウィジェットを作成するオプションがないため、QWidgetから派生したクラスが必要な場合は、手動で.cppを変更し、 .hファイルをQWidgetではなくQFrameから派生させます。

+0

こんにちは、ありがとう! QFrameから継承することは私のためのトリックでした。あなたは私の一日を救った。 – Benjamin

13

私は同様の問題がありましたが、それはQt Stylesheetsドキュメントを読むことで解決しました。背景のみをサポートすることにあなたのカスタムウィジェットを行わず

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

:それはそのようにpaintEventを()再実装する必要がQWidgetから継承したカスタムウィジェットにCSSスタイルを適用し、Qtのスタイルシートの参照に言われたよう

、背景 - クリップおよび背景 - 起点のプロパティを含む。

「Stylableウィジェットのリスト」 - >「QWidget」のセクションのQt Stylesheets referenceを読むことができます。

希望、それは役に立ちます!

+1

解決策として受け入れる必要があります –