Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt QFrame не сжимается под минимальные размеры. [RSS Feed]

#1 Март 26, 2013 07:57:17

Loki
Зарегистрирован: 2013-03-13
Сообщения: 28
Репутация: +  4  -
Профиль   Отправить e-mail  

PyQt QFrame не сжимается под минимальные размеры.

Вопрос такой, написал следующий код и вроде все работает, но не нравится то, что 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_())

Офлайн

#2 Март 26, 2013 19:27:06

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt QFrame не сжимается под минимальные размеры.

Не совсем понял, что хотите. Можно задать минимальный размер фрэймов

        for frame in (self.choice1, self.choice2):
            frame.setMinimumHeight(25)

upd:
Если речь о том, что фрэймы занимают больше места чем одиночная Label, то это надо смотреть setContentsMargins() и setSpacing().

Отредактировано reclosedev (Март 26, 2013 19:46:18)

Офлайн

  • Начало
  • » GUI
  • » PyQt QFrame не сжимается под минимальные размеры.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version