用于HLine / VLine颜色的QT样式表

时间:2013-01-29 11:08:24

标签: css qt stylesheet

我对这个QT事物很新,它是整个样式表系统。我的HTML / CSS背景有助于理解系统,但很多事情都是在没有明显原因的情况下发生的......或者没有发生

无论如何,HLINE和VLINE的神秘面纱以及如何改变线条颜色对我来说只是一个谜。我从其他问题和各种论坛中了解到它与QFrame元素相关联。如果我只使用像

这样的东西,我可以改变线条的颜色
QFrame
{
color: red;
}

但是这个当然也改变了使用QFrame的其他东西的颜色。我当然可以进入HLINE元素并输入“color:red;”在那里,这工作正常,但我的应用程序要求我把所有内容放在一个加载到应用程序的样式表中。因此,不能选择单个元素的样式。

解决方案就像是

QFrame HLine, QFrame VLine
{
color: red;
}

4 个答案:

答案 0 :(得分:11)

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

QFrame[frameShape="5"] /* QFrame::VLine == 0x0005 */
{
    color: green;
}

答案 1 :(得分:5)

HLineVLine风格很棘手。值得一看#34; Detailed Description"文档部分。为了快速解决问题,我发现这套规则允许通过样式表以可靠和相对干净的方式自定义这些行的外观:

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

无论frameShadow属性如何,这都会起作用,否则会影响它们的外观和样式规则的效果。请注意,默认情况下,行的宽度 1px - 可以使用min-widthmax-widthmin-height或{{1 }}属性,视情况而定。

有关我的发现的更详细的概述,请继续阅读。

默认情况下,大多数max-height都有QFrame::Plain frameShape,但QFrameHLine的默认frameShape为VLine。这意味着它们不是真正的线条,而是包含用于提供3D效果的中线的薄盒子。来自documentation

  

中线宽度指定框架中间的额外线条的宽度,使用第三种颜色获得特殊的3D效果。请注意,仅针对凸起或凹陷的Box,HLine和VLine帧绘制中线。

如果将frameShape设置为Plain,则此中线仍然可见,并且可以使用QFrame::Sunken属性设置样式(注意: <{1}} {{1} }或color!)

但是这对于没有默认沉没外观的HLine / VLine来说并不起作用。解决这个问题的一种方法是使用属性选择器和属性枚举的十进制值(在hehadecimal文档中描述)为Plain和Sunken QFrame设置单独的样式,如下所示:

background-color

但由于适用于使用QFrame :: Sunken的HLine / VLine的样式也适用于那些border-color的样式,所以这通常是一种浪费。我只是告诉他们如何使用属性选择器的教育价值。

最好的方法是将QFrame视为它的框,并且(1)设置/* 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::Plain加上border-top(或border-right对于VLine),确保盒子内部不占用布局中的空间;或(2)使用与max-height: 0px结合的背景颜色(在这种情况下,最大高度/宽度应为1或更大,否则QFrame不可见)。后者是我推荐的解决方案,如上面的第一个代码块所示。

希望这有帮助!

答案 2 :(得分: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) 即可。接下来会将名为 pushButton QPushButton的文本颜色更改为(0,0,255);.第三个更改一行的属性。线条只是一个QFrame 所以我可以提供的解决方案是将您的css放在一个文件中,然后使用QFileQTextStream加载此文件,然后使用主要winodw或主要小部件的css设置文件的内容setStyleSheet ( const QString & styleSheet )功能。或者如果您正在使用创建者,只需右键单击主窗口并选择更改样式表,然后粘贴您的CSS。 但请记住,您应该使用冲突解决方案

答案 3 :(得分:0)

根据QDarkStyleSheet issue,您可以使用:

QFrame[width="3"], QFrame[height="3]

这些选择器似乎可以跨平台工作,并且不太可能更改。 可能比使用enum值作为ints更好,因为它们可能随Qt版本而改变,而线条样式则不会,因为它们满足某些要求。