使用Python的qbox布局

2024-09-30 02:25:55 发布

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

由于它们的高度可定制性,我一直依赖于在构建appgui时使用多个groupbox。但Qgroupbox似乎对界面构建的速度有一定的影响。 现在有了layout的.insertLayout()方法,我可以构建一个完整的图形界面,将小部件放在任何我想要的地方。对话框感觉非常轻巧,重新绘制的速度非常快。不幸的是我找不到控制他们外表的方法。如果你能给我一些关于如何控制布局视觉属性的线索,我将不胜感激。我特别想知道:

  1. 如何绘制布局边框,如何控制边框线条宽度,

  2. 如何放置布局标题(类似于QGroupBox的.setTitle()所做的)

  3. 如何控制外部和内部页边距的布局。

  4. 如何使布局最小化/大小可恢复(这样当用户需要或不需要属于同一布局的某些小部件时,可以单击一些减号/箭头图标来折叠/展开布局。

下面是带有三个嵌套布局的示例。正如在对话框截图上看到的那样,由于没有边框、标题、分隔符等,因此无法从视觉上区分一个布局和另一个布局

enter image description here

from PyQt4 import QtGui, QtCore

class Dialog_01(QtGui.QMainWindow):
    def __init__(self):
        super(QtGui.QMainWindow,self).__init__()

        tabWidget = QtGui.QTabWidget()
        tabGroupBox = QtGui.QGroupBox()
        tabLayout = QtGui.QVBoxLayout()

        tabLayout.setContentsMargins(0, 0, 0, 0)
        tabLayout.setSpacing(0)    

        subLayoutA=QtGui.QVBoxLayout()
        tabLayout.insertLayout(0, subLayoutA)

        tabGroupBox.setLayout(tabLayout)
        tabWidget.addTab(tabGroupBox,' Tab A ')

        listWidgetA = QtGui.QListWidget()
        for i in range(3): 
            QtGui.QListWidgetItem( 'Item '+str(i), listWidgetA )

        subLayoutA.addWidget(listWidgetA)

        subLayoutB=QtGui.QHBoxLayout()
        tabLayout.insertLayout(1, subLayoutB)

        subLayoutB.addWidget(QtGui.QLineEdit('LineEdit 1'))
        subLayoutB.addWidget(QtGui.QLineEdit('LineEdit 2'))

        subLayoutC=QtGui.QVBoxLayout()
        tabLayout.insertLayout(2, subLayoutC)

        subLayoutC.addWidget(QtGui.QPushButton('PushButton 1'))
        subLayoutC.addWidget(QtGui.QPushButton('PushButton 2'))
        self.setCentralWidget(tabWidget)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dialog_1 = Dialog_01()
    dialog_1.show()
    dialog_1.resize(480,320)
    sys.exit(app.exec_())

稍后编辑

我在示例代码中插入了两行代码来实现sebastian提出的一个建议。间距边距方法组合可以有效地用于获得一些额外的调整完成。下面是一张截图(仍然无法去掉按钮周围的间距):

enter image description here


Tags: 方法self布局dialogqtguiqvboxlayoutaddwidgettabwidget
1条回答
网友
1楼 · 发布于 2024-09-30 02:25:55

QLayout子cases没有可视化的表示,这一点可以通过QLayout类不继承{}这一事实而变得清楚。他们只负责计算组件的父控件的位置。在

所以问题1、2和4的答案基本上是:你不能

你总是要有一个QWidget和一个QLayout的组合。 E、 g.要将两个按钮组合成一个带有方框的框架,请使用QFrame:

    subLayoutC=QtGui.QVBoxLayout()
    buttonFrame = QtGui.QFrame()
    buttonFrame.setFrameStyle(QtGui.QFrame.Plain |QtGui.QFrame.Box)
    buttonFrame.setLayout(subLayoutC)

    subLayoutC.addWidget(QtGui.QPushButton('PushButton 1'))
    subLayoutC.addWidget(QtGui.QPushButton('PushButton 2'))

    # now we add the QFrame widget - not subLayoutC to the tabLayout
    tabLayout.addWidget(buttonFrame) # I think your suggested edit was correct here
    self.setCentralWidget(tabWidget)

关于问题3,检查文档:

http://qt-project.org/doc/qt-4.8/qlayout.html#setContentsMargins

http://qt-project.org/doc/qt-4.8/qboxlayout.html#setSpacing

相关问题 更多 >

    热门问题