PyQt4 QLayout间距中的歧义

2024-10-01 07:18:48 发布

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

我有一个QHBoxLayout,一个接一个地添加小部件。
另一种方法是添加一个自定义小部件,而不是QLabel(重复)。
QHBoxLayout属于QGroupBox。在

但是,我注意到,当布局中添加的小部件很少时,自定义小部件和QLabel之间的间距是“不规则的”。在

我希望qlabel集中在定制小部件之间的间隙中,但是qlabel只会随着添加更多的小部件而接近中心。在

这些截图显示了这两个案例。
所需的案例(仅在布局中有大量小部件时发生),
以及不希望出现的情况(当布局中有小部件时发生)。在

Irregular Spacing in the bottom case, fine in the top.

正如您在下面的例子中所看到的,qlabel并不是在定制小部件之间居中的。相反,他们非常向右!在

是什么导致了这种行为??在

我相信QGroupBox有一个居中(水平)对齐方式,QLabel的固定宽度为10(或者对于'->;'QLabel为20)像素(以避免难看的重叠)。在

任何帮助都将不胜感激!
谢谢!在

规格:
python 2.7.1
PyQt4
Windows 7系统

QHBoxLayout的实例化完全正常,与所有示例相似。
这是填充布局的代码。在

for i in range (0,len(Reactants)):

    self.WidgetHouse.Reaction_Element_Layout.addWidget(eval('self.OverallContainer_Reactants.Reactant_'+str(i)))

    # self.WidgetHouse.Reaction_Element_Layout           is the QHBoxLayout
    # self.OverallContainer_Reactants.Reactant_'+str(i)       is a Custom Widget

    if i != (len(Reactants)-1):
        tmp = QtGui.QLabel('+')
        tmp.setFixedWidth(10)
        tmp.setAlignment(QtCore.Qt.AlignCenter)
        self.WidgetHouse.Reaction_Element_Layout.addWidget(tmp)

    else:
        tmp = QtGui.QLabel('->')
        tmp.setFixedWidth(20)
        tmp.setAlignment(QtCore.Qt.AlignCenter)
        self.WidgetHouse.Reaction_Element_Layout.addWidget(tmp)

编辑:

设置QLabels的固定宽度(tmp.setFixedWidth(10) )是“右锚定”的来源。
但是,不设置固定的宽度会导致布局中的qlabel和自定义小部件专用于相同的空间,从而导致qlabel和自定义小部件重叠。在

Fixed Width Labels vs Layout modulated widths

与上述代码相同,排除'tmp.setFixedWidt(10) '

我能做些什么来阻止这一切并不可怕?
我能把标签从前面移到后面吗?
(在将所有内容添加到布局后,对所有自定义窗口小部件调用.raise_u()无效)

(或者,我是否需要根据布局中的小部件数量手动计算标签的适当宽度?恶心!)在

另一个编辑:

进展情况:

我不会更改QLabels的最大/最小(或固定)宽度,但会将它们的对齐方式设置为居中。
相反,我设置了自定义控件的最小宽度。
这修复了明显的“重叠”(实际上不是这样)并使标签看起来“更居中”。在

但是,正如您所看到的,qlabel仍然没有完全居中-太右了。
如果我不在qlabel上设置中心对齐,它们就太左了。在

现在有什么问题??在

Overlapping solved, anchoring still an issue

(我没有在标签上设置最大宽度)

谢谢大家的帮助!在


Tags: self宽度部件标签布局elementtmplayout
2条回答

下面是一个简单的示例脚本,它是问题中UI的合理近似值,但没有任何布局问题:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.groupBox = QtGui.QGroupBox(self)
        hbox = QtGui.QHBoxLayout(self.groupBox)
        length = 3
        for index in range(length):
            hbox.addWidget(Widget(u'H\u2082O', self))
            if index < length - 1:
                hbox.addWidget(Label(u'+', self))
            else:
                hbox.addWidget(Label(u'\u2192', self))
        hbox.addWidget(Widget(u'4 H\u2082O', self))
        hbox.addWidget(Label(u'+', self))
        hbox.addWidget(Widget(u'H\u2084O\u2082', self))
        vbox = QtGui.QVBoxLayout(self)
        vbox.addWidget(self.groupBox)
        vbox.addStretch()

class Label(QtGui.QLabel):
    def __init__(self, label, parent=None):
        QtGui.QLabel.__init__(self, label, parent)
        self.setAlignment(QtCore.Qt.AlignCenter)

class Widget(QtGui.QWidget):
    def __init__(self, label, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setMaximumWidth(100)
        layout = QtGui.QGridLayout(self)
        self.label = QtGui.QLabel(label, self)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        layout.addWidget(self.label, 0, 0, 1, 2)
        self.lineEdit = QtGui.QLineEdit(self)
        layout.addWidget(self.lineEdit, 1, 0, 1, 2)
        self.toolButton = QtGui.QToolButton(self)
        layout.addWidget(self.toolButton, 2, 0, 1, 1)
        self.comboBox = QtGui.QComboBox(self)
        layout.addWidget(self.comboBox, 2, 1, 1, 1)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

所有问题的解决方案:

给自定义控件一个固定的宽度。

产生完全居中的控件,而不是“重叠”控件。
:)

谢谢你们的帮助!在

相关问题 更多 >