Найти - Пользователи
Полная версия: PyQt QFrame не сжимается под минимальные размеры.
Начало » GUI » PyQt QFrame не сжимается под минимальные размеры.
1
Loki
Вопрос такой, написал следующий код и вроде все работает, но не нравится то, что QFrame не возвращает минимальный размер, то есть я хочу чтобы после каждого выбора в комбобоксе окно и фреймы принимала более естественный размер. Не могу найти слов, чтобы обьяснить точнее, попробуйте запустить код и попереключать комбобокс.
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
UPPER,LOWER,BOTH = range(3)
class MainWind(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MainWind, self).__init__(parent)
        label_choose = QtGui.QLabel('Выбор отображаемых фреймов')
        self.choose = QtGui.QComboBox()
        self.choose.addItems(['Используется верхний',
                              'Используется нижний',
                              'Используются оба'])
        self.choice1 = QtGui.QFrame(self)
        self.choice1.setFrameStyle(QtGui.QFrame.NoFrame |
                                   QtGui.QFrame.Plain)
        self.choice2 = QtGui.QFrame(self)
        self.choice2.setFrameStyle(QtGui.QFrame.NoFrame |
                                   QtGui.QFrame.Plain)
        label = QtGui.QLabel('   Нижний элемент')
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(self.choose)
        vbox.addWidget(self.choice1)
        vbox.addWidget(self.choice2)
        vbox.addWidget(label)
        self.setLayout(vbox)
        self.on_show(self.choose.currentIndex())
        self.choose.currentIndexChanged["int"].connect(self.on_show)
        
    def on_show(self, num):
        self.clearLayout(self.choice1)
        self.clearLayout(self.choice2)
        if num == UPPER:
            label = QtGui.QLabel('Для примера 1')
            vbox = QtGui.QVBoxLayout()
            vbox.addWidget(label)
            self.choice1.setLayout(vbox)
        elif num == LOWER:            
            label2 = QtGui.QLabel('Для примера 2')
            vbox2 = QtGui.QVBoxLayout()
            vbox2.addWidget(label2)
            self.choice2.setLayout(vbox2)
        elif num == BOTH:
            label1 = QtGui.QLabel('Для примера 1')
            label2 = QtGui.QLabel('Для примера 2')
            vbox1 = QtGui.QVBoxLayout()
            vbox1.addWidget(label1)
            self.choice1.setLayout(vbox1)
            vbox2 = QtGui.QVBoxLayout()
            vbox2.addWidget(label2)
            self.choice2.setLayout(vbox2)
    def clearLayout(self, widget):
        if widget.layout() is not None:
            old_layout = widget.layout()
            for i in reversed(range(old_layout.count())):
                old_layout.itemAt(i).widget().setParent(None)
            import sip
            sip.delete(old_layout)
        
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWind()
    window.show()
    sys.exit(app.exec_())
reclosedev
Не совсем понял, что хотите. Можно задать минимальный размер фрэймов
        for frame in (self.choice1, self.choice2):
            frame.setMinimumHeight(25)

upd:
Если речь о том, что фрэймы занимают больше места чем одиночная Label, то это надо смотреть setContentsMargins() и setSpacing().
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB