PyQt4 - Неяснота в QLayout Spacing

Имам QHBoxLayout, към който добавям приспособления, един по един.
Редувам добавянето на Custom Widget, отколкото QLabel (повтаряне).
QHBoxLayout е собственост на QGroupBox.

Забелязвам обаче, че разстоянието между Custom Widget и QLabel е „неправилно“, когато има малко джаджи, добавени към оформлението.

Възнамерявам QLabels да бъдат центрирани в празнината между персонализираните приспособления, но QLabels се доближават до центъра само когато се добавят още приспособления.

Тези екранни снимки показват двата случая.
Желаният случай (среща се само с много джаджи в оформлението),
и нежеланият случай (среща се, когато в оформлението има малки джаджи).

Неправилно разстояние в долния регистър, добре в горния.

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

На какво се дължи това поведение??

Вярвам, че QGroupBox има центрирано (хоризонтално) подравняване и QLabels имат фиксирана ширина от 10 (или 20 за '->' QLabel) пиксела (за да се избегне грозно припокриване).

Всякаква помощ ще бъде високо оценена!
Благодаря!

Спецификации:
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)) е източникът на „правилното закотвяне“.
Въпреки това, ако не се зададе фиксирана ширина, същото място се отделя за QLabels и персонализирани Widgets в оформлението , което води до припокриване на QLabels и Custom Widgets.

Етикети с фиксирана ширина спрямо модулирани ширини на оформлението

Идентичен с кода по-горе, с изключение на „tmp.setFixedWidt(10)“

Какво мога да направя, за да предотвратя това, което не е напълно ужасно?
Мога ли да преместя етикетите „назад“ отпред?
(Извикването на .raise_() на всички персонализирани джаджи, след като всичко беше добавено към оформлението, не успя работа)

(Или ще трябва да направя нещо като ръчно изчисляване на подходящата ширина на етикетите въз основа на количеството приспособления в оформлението? Мда!)

ДРУГА РЕДАКЦИЯ:

Напредък:

Не променям максималната/минималната (или фиксираната) ширина на QLabels, но задавам подравняването им в центъра.
Вместо това задавам минимална ширина на персонализираната джаджа.
Това коригира очевидното „припокриване“ “ (което всъщност не беше така) и кара етикетите да изглеждат „по-центрирани“.

Въпреки това, както можете да видите, QLabels все още не са идеално центрирани - твърде вдясно.
Ако не задам централно подравняване на QLabels, те са твърде вляво.

Какъв може да е проблема сега??

Припокриването е решено, закрепването все още е проблем

(Не задавам максимална ширина на етикетите)

Благодаря за цялата помощ досега, момчета!


person Anti Earth    schedule 21.12.2011    source източник
comment
Има свойство, наречено нещо като expanding, което управлява поведението при преоразмеряване. Може да искате да си поиграете с Qt дизайнера.   -  person Thomas K    schedule 21.12.2011
comment
Не съм сигурен какво означава това. Дали това е QProperty или свойство на конкретен Widget (т.е.: Оформлението или QLabel?)?   -  person Anti Earth    schedule 21.12.2011
comment
Това е свойство на вашите джаджи - както етикетите, така и вашите персонализирани джаджи, очаквам. О, и се казва sizePolicy - моя грешка.   -  person Thomas K    schedule 21.12.2011
comment
Трябва да липсва нещо в обяснението ви, защото не мога да възпроизведа това нито на Linux, нито на Windows. Второто изображение няма смисъл въз основа на кода, който сте показали, защото джаджите трябва просто автоматично да се оразмерят, за да запълнят наличното пространство. Не трябва да има нужда да се коригира ширината на етикетите или да се променя политиката за размера на който и да е от модулите. Най-доброто ми предположение е, че има излишен разделителен елемент от дясната страна на персонализираните джаджи.   -  person ekhumoro    schedule 21.12.2011
comment
Няма никакви дистанционни елементи! :( Трябваше да коригирам ширината на етикетите, защото ако не го направя, когато оформлението стане доста попълнено, QLabels започват да припокриват персонализираните приспособления (без нищо, тъй като геометрията на QLabel е по-голяма от текста? ).   -  person Anti Earth    schedule 22.12.2011
comment
@AntiEarth. Добавих отговор, който показва един възможен начин за оформление на джаджи без нито един от проблемите, които описвате. И така, какви значителни разлики има между моя скрипт и вашия действителен дизайн на потребителския интерфейс?   -  person ekhumoro    schedule 22.12.2011


Отговори (2)


Ето прост примерен скрипт, който е разумно приближение на потребителския интерфейс във въпроса, но без никакви проблеми с оформлението:

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_())
person ekhumoro    schedule 22.12.2011
comment
Разликата в кодовете (която всъщност причинява тази грешка) е, че зададох фиксирана ширина на моите QLabels (както ekhumoro убягна). Това е причината за странното „закотвяне на дясната страна“. Незадаването на фиксирана ширина обаче води до собствени проблеми (припокриване). Ще публикувам снимка и ще редактирам OP. - person Anti Earth; 24.12.2011
comment
Забелязах, че сте задали подравняването на етикета два пъти. Веднъж в подклас и пак в супер. Това би ли повлияло на припокриването? - person Anti Earth; 24.12.2011
comment
@AntiEarth. В моя пример, ако на класа Label е дадена фиксирана ширина, той просто добавя малко допълнително разстояние; няма припокриване или други неочаквани ефекти. Страхувам се, че изобщо не разбирам втория ви коментар: подравняването не е зададено два пъти и няма извикване на super. Бъркате ли етикета в класа Widget с класа Label? Що се отнася до новите снимки, които публикувахте: това е полезно, но мисля, че единственият практичен начин да се реши това е да се публикува някакъв код (или ui файл), който демонстрира проблема(ите). - person ekhumoro; 24.12.2011
comment
Съжалявам, обърках етикетите. Редактирах OP отново с напредък. - person Anti Earth; 25.12.2011

Решение на всички проблеми:

Дайте на персонализираните приспособления фиксирана ширина.

Резултатът е идеално центрирани, а не „припокриващи се“ джаджи.
:)

Благодаря за цялата помощ момчета!

person Anti Earth    schedule 26.12.2011
comment
Или просто им дайте максимална ширина, както направих в моя примерен скрипт ;-) - person ekhumoro; 26.12.2011