我有一个QSplitter和两个小部件,但我希望能够有一个保证金,以便两个小部件之间有一个明确的过渡。我查看了QSplitter和QSplitterHandle,但没有看到任何明确的方法。
如何在两个小部件之间添加分隔符?
答案 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_())