我的PyQt5自定义滚动条样式表不适用

2024-05-19 06:48:37 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我对PyQt5中的样式表有一个问题。我正在尝试为我的QListWidget创建一个自定义滚动条,它在QtEditor中运行良好,但在运行实际代码或在设计器中预览时不起作用。以下是样式表:

QTableWidget{
    border-radius: 10px;
    background-color: transparent
}


QHeaderView::section{
    background-color:transparent;
    border-radius:10px;
}

QTableWidget::item{
    border-radius: 10px;
    background-color: rgb(92, 95, 141);
    margin-bottom: 3px;
    margin-right: 3px;
}


QTableWidget::item:selected{
    color: rgb(255, 255, 255);
    background-color: rgb(143, 154, 255);
    border: 0px;
}

QScrollBar:vertical {
            border: 0px solid #999999;
            background-color: rgb(34, 35, 52);
            width:14px;    
            margin: 0px 0px 0px 3px;
        }
        QScrollBar::handle:vertical {         
            min-height: 0px;
            border: 0px solid red;
            border-radius: 5px;
            background-color: rgb(92, 95, 141);
        }
        QScrollBar::add-line:vertical {       
            height: 0px;
            subcontrol-position: bottom;
            subcontrol-origin: margin;
        }
        QScrollBar::sub-line:vertical {
            height: 0 px;
            subcontrol-position: top;
            subcontrol-origin: margin;
        }

当我在Qt设计器中使用look时,它工作得很好

但当我在Designer中预览滚动条时,它显示为默认滚动条

我还试着用python运行代码,得到了相同的结果。那么,为什么设计师显示样式表工作良好,但实际上根本不工作呢

编辑: 通过将scrollbar样式表应用于scrollbar的父元素,问题得到了解决


Tags: 代码marginrgbitem样式表colorbackgroundheight
1条回答
网友
1楼 · 发布于 2024-05-19 06:48:37

tl;博士

确保您没有使用通用样式表;例如,在提供的ui文件中,将TaskScreen的样式表更改为:

QFrame#TaskScreen {
    background-color: rgb(34, 35, 52);
}

解释

在Qt小部件上设置样式表时,需要注意两个方面:

  1. 与标准样式表一样,它们是级联的,这意味着子对象继承为其父对象设置的属性
  2. 最好避免使用通用选择器或通用属性

第一点的问题是,许多小部件实际上是具有子部件的复杂小部件(有时即使在编程级别也无法访问,但仍将表现为QWidgets),最重要的是,从QAbstractScrollArea继承的所有类(如项目视图)始终有两个滚动条,由于这些滚动条是滚动区域的直接子项,它们将继承父样式表

第二点的问题是,使用通用或通用选择器设置的属性可能会以意外的方式运行,这取决于应用它们的小部件

虽然使用这些样式表对于没有子项的非常简单的小部件(QLabel、QPushButton)来说很好,但是对于复杂的小部件来说,它可能会成为一个问题,特别是如果它们有需要更彻底样式的子控件的话

必须始终考虑stylesheet syntax文档中的这一重要注释:

Note: With complex widgets such as QComboBox and QScrollBar, if one property or sub-control is customized, all the other properties or sub-controls must be customized as well.

虽然您自定义了几乎所有的属性,但也为父窗口小部件(UI示例中的TaskScreen QFrame)设置了一个通用属性:

background-color: rgb(34, 35, 52);

结果是,它的所有子代和子代,无论它们是什么类,都将设置优先级属性,考虑到上面的注释,结果是样式表没有正确使用,因为Qt样式表样式解析器发现设置了一个属性,但缺少其他重要的属性

解决方案是为父级正确使用类型选择器:

QFrame {
    background-color: rgb(34, 35, 52);
}

如果要确保只有对象使用该背景,可以使用更specific selector,最常见的是对象名称选择器:

QFrame#TaskScreen {
    background-color: rgb(34, 35, 52);
}

或者,类选择器,只处理该类的实例,但不处理其子类:

.QFrame {
    background-color: rgb(34, 35, 52);
}

这一点很重要,因为实际上有很多类是从QFrame继承的,包括QLabel和所有基于QAbstractScrollAreas的类,如上所述

除了上面解释的以外,根据经验,通常最好避免单独设置每个小部件的样式:您可能会在父部件上设置通用样式表,然后忘记它,经过大量修改后,你可能会注意到像你这样的意外行为,发现问题到底在哪里真的很烦人

通常,更好的方法是设置“主”样式表(设置在顶级窗口、主窗口甚至QApplication上),正确使用选择器并仔细继承属性和状态,然后只更改要更改其默认外观的特定小部件上的小属性

相关问题 更多 >

    热门问题