8

我对这个 Qt 事物及其整个样式表系统很陌生。我的 HTML/CSS 背景对理解系统有一点帮助,但是很多事情只是无缘无故地发生……或者根本就没有发生。

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

QFrame
{
color: red;
}

但这当然也会改变大量使用 QFrame 的其他事物的颜色。我当然可以进入 HLINE 元素并将其放入color: red;其中并且效果很好,但是我的应用程序要求我将所有内容放在一个加载到应用程序中的样式表中。因此,样式化单个元素不是一种选择。

一个解决方案看起来像

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属性无关,否则会影响它们的外观和样式规则的效果。请记住,默认情况下线条的宽度不是1px —— 这可以使用 、 或 属性进行更改min-width,视情况而定max-widthmin-heightmax-height

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


大多数QFrames 默认具有QFrame::Plain frameShape,但HLineandVLine的默认 frameShape 是QFrame::Sunken. 这意味着它们不是真正的线条,而是包含用于提供 3D 效果的中线的细框。从文档中:

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

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

但这不适用于保留默认 Sunken 外观的 HLine/VLine。解决此问题的一种方法是使用属性选择器和属性枚举的十进制值(在 hehadecimal 文档中描述)为普通和沉没 QFrames 设置单独的样式,如下所示:

/* 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-right与一个max-height: 0px(或max-width对于一个 VLine)耦合,以确保盒子的内部不会占用布局中的空间;或者 (2) 使用背景颜色加上border: none(在这种情况下,max-height/width 应该是 1 或更大,否则 QFrame 是不可见的)。后者是我推荐的解决方案,如上面的第一个代码块所示。

希望这可以帮助!

于 2017-01-05T22:30:02.597 回答
2

根据QDarkStyleSheet 问题,您可以使用:

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

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

于 2019-03-21T14:44:38.403 回答
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 );。行的第三个更改属性。行只是一个 QFrame。
因此,我可以提供的解决方案是将您的 css 放在一个文件中,然后使用加载该文件QFile,然后使用函数QTextStream为您的主 winodw 或主小部件的 css 设置文件的内容。setStyleSheet ( const QString & styleSheet )或者如果您使用的是创建者,只需右键单击主窗口并选择更改样式表,然后粘贴您的 CSS。但请记住,您应该使用冲突解决方案.

于 2013-01-29T11:56:53.693 回答