QSplitter在两个小部件之间显示分隔符或边距

时间:2011-07-26 15:24:38

标签: c++ qt user-interface layout margin

我有一个QSplitter和两个小部件,但我希望能够有一个保证金,以便两个小部件之间有一个明确的过渡。我查看了QSplitter和QSplitterHandle,但没有看到任何明确的方法。

如何在两个小部件之间添加分隔符?

4 个答案:

答案 0 :(得分:11)

样式表是一种用于更改Qt中任何窗口小部件外观的强大机制。

有关快速教程,请参阅here;有关参考指南,请参阅here。样式表可以使用Designer中的编辑器分配,也可以使用setStylesheet(QString)作为字符串传递。使用Designer肯定更容易,因为在运行它之前你可以看到你的小部件会是什么样子。

现在,针对您的具体问题。 QSplitter本质上是一个QFrame。但它也包括一个手柄 - 如你所知。通常这就是通常的样式。

所以,例如你可以这样做:

QSplitter::handle {
         image: url(:/images/splitter.png);
     }

为分离器手柄提供图像。这有点类似于Motif下的内容,其中总是显示一个小矩形手柄,用户可以点击它来移动分割器。

通过一些实验,您可以为手柄创建一个很酷的分离线。

QSplitter::handle {
    background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, 
stop:0 rgba(255, 255, 255, 0), 
stop:0.407273 rgba(200, 200, 200, 255), 
stop:0.4825 rgba(101, 104, 113, 235), 
stop:0.6 rgba(255, 255, 255, 0));
    image: url(:/images/splitter.png);
     }

或者更像这样的东西。

QSplitter::handle:horizontal {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
    stop:0 #eee, stop:1 #ccc);
border: 1px solid #777;
width: 13px;
margin-top: 2px;
margin-bottom: 2px;
border-radius: 4px;
}

对于最后一个,我们专门只覆盖水平分割器,因为有一些属性 - 比如margin-top和bottom,以及如果我们改变垂直分割器需要不同的宽度。

希望这会有所帮助。一旦你开始玩Style Sheet,乐趣才真正开始。

答案 1 :(得分:1)

QSplitter具有您可以设置的handleWidth属性。

答案 2 :(得分:1)

如果不了解样式表的所有细节,我可以给你几个选择:

1)您可以在拆分器中布置几个QFrame,为它们提供布局,并将您的小部件放在这些框架内。你可以使用布局'间距选项(请参阅QLayout :: setContentsMargin())在小部件周围添加一些间距。

2)样式表方式(以我认为优越的方式)是为您的小部件设置一些样式表。举一个简单的例子,您可以在分割器中的小部件上执行类似的操作:

widget->setStyleSheet( "margin-left: 10px" )

如果您正在使用Qt进行任何类型的GUI设计,我强烈建议您了解样式表,他们是您的朋友。有关文档,请参阅the Qt style sheets reference

答案 3 :(得分:0)

在这里,您可以覆盖QSplitter类,使拆分器具有一些图标,以使用户知道他们可以调整小部件的大小,请参见图像以获取输出。 enter image description here

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

class Handle(QWidget):
    def paintEvent(self, e=None):
        painter = QPainter(self)
        painter.setPen(Qt.NoPen)
        painter.setBrush(Qt.Dense6Pattern)
        painter.drawRect(self.rect())

class customSplitter(QSplitter):
    def addWidget(self, wdg):
        super().addWidget(wdg)
        self.width = self.handleWidth()
        l_handle = Handle()
        l_handle.setMaximumSize(self.width*2, self.width*10)
        layout = QHBoxLayout(self.handle(self.count()-1))
        layout.setSpacing(0)
        layout.setContentsMargins(0,0,0,0)
        layout.addWidget(l_handle)

class Window(QMainWindow):
    def setUI(self, MainWindow):
        self.splt_v = customSplitter(Qt.Vertical)
        self.splt_v.setHandleWidth(8)
        self.splt_v.addWidget(QGroupBox("Box 1"))
        self.splt_v.addWidget(QGroupBox("Box 2"))
        self.splt_v.addWidget(QGroupBox("Box 3"))

        self.wdg = QWidget()
        self.v_lt = QVBoxLayout(self.wdg)
        self.v_lt.addWidget(self.splt_v)

        self.spl_h = customSplitter()
        self.spl_h.addWidget(self.wdg)
        self.spl_h.addWidget(QGroupBox("Box 4"))
        self.spl_h.addWidget(QGroupBox("Box 5"))

        self.h_lt = QHBoxLayout()
        self.h_lt.addWidget(self.spl_h)
        self.w = QWidget()
        self.w.setLayout(self.h_lt)
        self.w.setGeometry(0,0,1280,720)
        self.w.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = Window()
    ui.setUI(MainWindow)
    sys.exit(app.exec_())