8

私はこの Qt のこととそのスタイルシート システム全体にかなり慣れていません。私の HTML/CSS のバックグラウンドは、システムを理解するのに少し役立ちますが、多くのことは明らかな理由もなく発生します....または発生しません。

とにかくHLINEとVLINEの謎と線の色の変え方が謎です。他の質問やさまざまなフォーラムから、それが QFrame 要素にリンクされていることを知りました。そして、次のようなものを使用すると、線の色を変更できます

QFrame
{
color: red;
}

しかし、これはもちろん、QFrame を使用する他の多くのものの色も変更します。もちろん、HLINE 要素に入っcolor: red;てそこに配置することもできますが、それは正常に機能しますが、私のアプリでは、アプリに読み込まれる 1 つのスタイルシートにすべてを配置する必要があります。したがって、個々の要素のスタイリングはオプションではありません。

解決策は次のようになります

QFrame HLine, QFrame VLine
{
color: red;
}
4

4 に答える 4

17
QFrame[frameShape="4"] /* QFrame::HLine == 0x0004 */
{
    color: red;
}

QFrame[frameShape="5"] /* QFrame::VLine == 0x0005 */
{
    color: green;
}
于 2013-01-29T12:46:19.957 に答える
13

HLineそしてVLineスタイリングが難しい。ドキュメントの「詳細な説明」セクションを参照してください。簡単な修正として、この一連のルールを使用すると、スタイルシートを介してそのような行の外観を信頼できる比較的クリーンな方法でカスタマイズできることがわかりました。

QFrame[frameShape="4"],
QFrame[frameShape="5"]
{
    border: none;
    background: red;
}

これはframeShadowプロパティに関係なく機能し、それ以外の場合は外観とスタイル ルールの効果に影響します。線の幅はデフォルトでは 1 ピクセルではないことmin-widthに注意してください。これは、 、max-widthmin-heightまたはmax-heightプロパティを使用して適宜変更できます。

私の調査結果のより詳細な概要については、一緒に読んでください。


ほとんどQFrameの はデフォルトでQFrame::Plain frameShape を持っていますが、HLineVLineのデフォルトの frameShape はQFrame::Sunkenです。これは、実際には線ではなく、3D 効果を提供するために使用される中間線を含む薄いボックスであることを意味します。ドキュメントから:

中間線の幅は、特別な 3D 効果を得るために 3 番目の色を使用する、フレームの中央にある余分な線の幅を指定します。中線は、浮き上がっているか沈んでいる Box、HLine、および VLine フレームに対してのみ描画されることに注意してください。

frameShape を Plain に設定すると、この中央線は引き続き表示され、colorプロパティでスタイルを設定できます (注:またはではありません!)background-colorborder-color

しかし、これは、デフォルトの沈んだ外観のままになっている HLine/VLine には機能しません。これを修正する 1 つの方法は、次のように、プロパティ列挙型の 10 進数値 (ドキュメントの hehadecimal で説明されています) で属性セレクターを使用して、Plain QFrame と Sunken QFrame に別々のスタイルを設定することです。

/* Reference (from doc.qt.io/qt-5/qframe.html#types):
 * - frameShape[4] --> QFrame::HLine = 0x0004
 * - frameShape[5] --> QFrame::VLine = 0x0005
 * - frameShadow[16] --> QFrame::Plain = 0x0010 (default for most widgets)
 * - frameShadow[48] --> QFrame::Sunken = 0x0030 (default for HLine/VLine)
 */
QFrame[frameShape="4"][frameShadow="16"],
QFrame[frameShape="5"][frameShadow="16"]
{
    ...
}

QFrame[frameShape="4"][frameShadow="48"],
QFrame[frameShape="5"][frameShadow="48"]
{
    ...
}

しかし、QFrame::Sunken を使用した HLine/VLine で機能するスタイルは、 を使用したスタイルでも機能するためQFrame::Plain、通常は無駄です。属性セレクターの使用方法についてのみ、教育的価値のために上に示しています。

最善の方法は、QFrame をそのままのボックスとして扱い、(1) (またはVLine に対して) 設定border-topまたはborder-right結合して、ボックスの内部がレイアウト内のスペースを占有しないようにすることです。または(2)背景色を組み合わせて使用​​します(この場合、最大高さ/幅は1以上である必要があります。そうでない場合、QFrameは非表示になります)。上記の最初のコード ブロックに示されているように、後者をお勧めします。max-height: 0pxmax-widthborder: none

お役に立てれば!

于 2017-01-05T22:30:02.597 に答える
1

しかし、私のアプリでは、アプリに読み込まれる単一のスタイルシートにすべてを配置する必要があります。

競合の解決を使用できます。多数のウィジェットを含む QMainWindow オブジェクトがあるとしますmaindionwスタイル シート に次のスタイル シートを設定します。

QLabel#label{
    background-color: rgb(255, 170, 255);
}
QPushButton#pushButton{

    color: rgb(0, 0, 255);
}
QFrame#line{
    background-color: rgb(0, 170, 255);
}

最初の css は、メインウィンドウのQLabel名前ラベルを変更し、その背景色rgb(255, 170, 255) に設定するだけです。QPushButton次は、名前付きプッシュ ボタンのテキストの色を (0,0,255); に変更ます。行の 3 番目の変更プロパティです。行は単なる QFrame です。
したがって、私が提供できる解決策は、css をファイルに配置し、このファイルを使用してロードし、QFile関数QTextStreamを使用してメインの winodw またはメインのウィジェットの css のファイルの内容を設定することですsetStyleSheet ( const QString & styleSheet )。またはクリエーターを使用している場合は、メイン ウィンドウを右クリックして [スタイルシートの変更] を選択し、css を貼り付けます。ただし、競合解決を使用する必要があることに注意してください.

于 2013-01-29T11:56:53.693 に答える