PyQt4 - Неоднозначность в QLayout Spacing - PullRequest
0 голосов
/ 21 декабря 2011

У меня есть QHBoxLayout, к которому я добавляю виджеты, один за другим.
Я чередую, добавляя пользовательский виджет, а не QLabel (повторяющийся).
QHBoxLayout принадлежит QGroupBox.

Тем не менее, я замечаю, что интервал между пользовательским виджетом и QLabel 'нерегулярен', когда в макет добавлено несколько виджетов.

Я намерен центрировать QLabels в промежутке между пользовательскимвиджеты, но QLabels только приближаются к центру при добавлении большего количества виджетов.

На этих снимках экрана показаны два случая.
Требуемый случай (встречается только с большим количеством виджетов в макете),
инежелательный случай (возникает, когда в макете маленькие виджеты).

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

Как видно из нижнего регистра, QLabels не центрированы между пользовательскими виджетами.Вместо этого они расположены очень далеко вправо!

Что вызывает такое поведение ??

Я считаю, что QGroupBox имеет центрированное (горизонтальное) выравнивание, а QLabels имеют фиксированную ширину 10 (или 20 для '->' QLabel) пикселей (чтобы избежать уродливого наложения).

Любая помощь будет принята с благодарностью!
Спасибо!

Характеристики:
python2.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)) является источником «правильной привязки».
Однако, если не установить фиксированную ширину, то же пространство будет выделено для QLabels и пользовательских виджетов в макете, что приведет к перекрытию QLabels и пользовательских виджетов.

Fixed Width Labels vs Layout modulated widths

Идентичен приведенному выше коду, исключая 'tmp.setFixedWidt (10)'

Что я могу сделать, чтобы это не было ужасно?
Могу ли я переместить метки «назад» спереди?
(вызов .raise_ () для всех пользовательских виджетов после того, как все было добавлено в макет, не работает)

(или мне придетсясделать что-то вроде ручного расчета соответствующей ширины надписей на основе количества виджетов в макете? Тьфу!)

ДРУГОЕ РЕДАКТИРОВАНИЕ:

Ход выполнения:

Я не изменяю максимальную / минимальную (или фиксированную) ширину QLabels, но я устанавливаю их выравнивание по центру.
Вместо этого я устанавливаю минимальную ширину пользовательского виджета.
Это исправляеточевидное «перекрытие» (что на самом деле не имело место) и делает метки «более центрированными».

Однако, как вы можете видеть, QLabels все еще не идеально центрированы - слишком далеко вправо.
Если я не установлю выравнивание по центру на QLabels-омОни слишком далеко ушли.

В чем может быть проблема сейчас ??

Overlapping solved, anchoring still an issue

(я не устанавливаю максимальную ширину на этикетках)

Спасибо всемпомощь пока ребята!

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Вот простой пример сценария, который является разумным приближением пользовательского интерфейса в вопросе, но без каких-либо проблем с макетом:

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_())
0 голосов
/ 26 декабря 2011

Решение всех проблем:

Придайте настраиваемым виджетам фиксированную ширину.

В результате получаются идеально центрированные, а не «перекрывающиеся» виджеты.
:)

Спасибо за помощь, ребята!

...