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

问题描述 投票:3回答:4

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

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

QFrame
{
color: red;
}

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

解决方案就像是

QFrame HLine, QFrame VLine
{
color: red;
}
css qt stylesheet
4个回答
12
投票
QFrame[frameShape="4"] /* QFrame::HLine == 0x0004 */
{
    color: red;
}

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

6
投票

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

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

无论frameShadow属性如何,这都会起作用,否则会影响它们的外观和样式规则的效果。请记住,默认情况下,线条的宽度不是1px - 可以根据需要使用min-widthmax-widthmin-heightmax-height属性进行更改。

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


大多数QFrames默认都有QFrame::Plain frameShape,但HLineVLine的默认frameShape是QFrame::Sunken。这意味着它们不是真正的线条,而是包含用于提供3D效果的中线的薄盒子。来自documentation

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

如果将frameShape设置为Plain,则此中线仍然可见,并且可以使用color属性设置样式(注意:那不是background-colorborder-color!)

但这对于保留默认凹陷外观的HLine / VLine不起作用。解决这个问题的一种方法是使用属性选择器和属性枚举的十进制值(在hehadecimal的文档中描述)为Plain和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)设置border-topborder-rightmax-height: 0px(或用于VLine的max-width),以确保盒子内部不占用空间布局;或(2)使用与border: none相结合的背景颜色(在这种情况下,最大高度/宽度应为1或更大,否则QFrame不可见)。后者是我推荐的解决方案,如上面的第一个代码块所示。

希望这可以帮助!


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);.第三个更改line的属性.Lines只是一个QFrame。 所以我可以提供的解决方案是将你的css放在一个文件中,然后使用QFileQTextStream加载这个文件,然后使用setStyleSheet ( const QString & styleSheet )函数设置你的主要winodw或主要小部件的css文件的内容。或者如果您正在使用创建者,只需右键单击主窗口并选择更改样式表,然后粘贴您的CSS。但请记住,您应该使用冲突解决方案。


0
投票

根据QDarkStyleSheet issue,您可以使用:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.