检查RadioButton时调整QDialog的大小PyQt

时间:2016-11-10 13:32:36

标签: qt pyqt resize qdialog

没有那么多经验与pyqt ..

我使用带有2个Radiobuttons的Qt Designer设计了一个UI。

根据所选的RadioButton,某些小部件是可见的,而其他小部件则不可见。我不想做的是根据UI中可见的小部件数自动调整对话框的布局。

问题与this one非常相似。这里是可能有助于理解问题的代码摘录(我知道它只是代码的一部分,但整个对话框很长):

class MyDialog(QDialog, FORM_CLASS):
    ..........

    # connect the radioButton with a function that reloads the UI
    self.radioSingle.toggled.connect(self.refreshWidgets)


    .....

    # dictionary with all the widgets and the values
    self.widgetType = {
            self.cmbModelName: ['all'],
            self.cmbGridLayer: ['all'],
            self.cmbRiverLayer: ['all'],
            self.lineNewLayerEdit: ['all'],
            self.lineLayerNumber: ['single']
        }

# function that refresh the UI with the correct widgets depending on the radiobutton selected
    def refreshWidgets(self, idx):
        '''
        refresh UI widgets depending on the radiobutton chosen
        '''


        tp = self.radioSingle.isChecked()

        for k, v in self.widgetType.items():
            if tp:
                if 'all' or 'single' in v:
                    active = True
                k.setEnabled(active)
                k.setVisible(active)
            else:
                active = 'all' in v
                k.setEnabled(active)
                k.setVisible(active)

        # attempt to resize the Dialog
        self.setSizeConstraint()

当然代码可以改进(代码编写不熟练)......

1 个答案:

答案 0 :(得分:0)

您只需设置您的用户界面即可在需要时调整大小。 有很多更美妙的方法可以做到这一点,但这是一个简单而快速的例子:

您只需定义布局即可按您希望的方式运行。如果您使用最小和最大尺寸,它会根据您的需要调整大小。 你也可以拥有自己的个性化按钮,小工具......你会有一个更干净的代码。

import sys

from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QDialog
from PyQt5.QtWidgets import QHBoxLayout
from PyQt5.QtWidgets import QRadioButton
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QWidget


class CustomDialog(QDialog):

    w_container = None
    v_layout_container = None
    v_scroll_area = None
    v_layout_preview = None


    def __init__(self):
        """Init UI."""

        super(CustomDialog, self).__init__()
        self.init_ui()

    def init_ui(self):
        """Init all ui object requirements."""

        self.r1 = QRadioButton("smaller")
        self.r2 = QRadioButton("bigger")

        style = "background: green;"
        size = [200, 50]

        self.small_size = [200, 250]
        self.big_size = [200, 500]

        self.resize(200,200)

        self.w1 = QWidget()
        self.w2 = QWidget()
        self.w3 = QWidget()
        self.w4 = QWidget()
        self.w5 = QWidget()
        self.w6 = QWidget()
        self.w1.setStyleSheet(style)
        self.w2.setStyleSheet(style)
        self.w3.setStyleSheet(style)
        self.w4.setStyleSheet(style)
        self.w5.setStyleSheet(style)
        self.w6.setStyleSheet(style)
        self.w1.setFixedSize(size[0], size[1])
        self.w2.setFixedSize(size[0], size[1])
        self.w3.setFixedSize(size[0], size[1])
        self.w4.setFixedSize(size[0], size[1])
        self.w5.setFixedSize(size[0], size[1])
        self.w6.setFixedSize(size[0], size[1])

        self.full_container = QVBoxLayout()
        self.full_container.setContentsMargins(0,0,0,0)

        self.radio_widget = QWidget()
        self.radio_widget.setFixedSize(200, 50)
        self.radio_container = QHBoxLayout()
        self.radio_container.setContentsMargins(0,0,0,0)

        self.widget_widget = QWidget()
        self.widget_container = QVBoxLayout()

        self.radio_widget.setLayout(self.radio_container)
        self.widget_widget.setLayout(self.widget_container)

        self.full_container.addWidget(self.radio_widget)
        self.full_container.addWidget(self.widget_widget)

        self.radio_container.addWidget(self.r1)
        self.radio_container.addWidget(self.r2)

        self.widget_container.addWidget(self.w1)
        self.widget_container.addWidget(self.w2)
        self.widget_container.addWidget(self.w3)
        self.widget_container.addWidget(self.w4)
        self.widget_container.addWidget(self.w5)
        self.widget_container.addWidget(self.w6)

        self.setLayout(self.full_container)

        self.r1.setChecked(True)

    def paintEvent(self, event):
        if self.r1.isChecked():
            self.w4.hide()
            self.w5.hide()
            self.w6.hide()
            self.setFixedSize(self.small_size[0],self.small_size[1])
        elif self.r2.isChecked():
            self.w4.show()
            self.w5.show()
            self.w6.show()
            self.setFixedSize(self.big_size[0], self.big_size[1])
        self.full_container.update()
        super(CustomDialog, self).paintEvent(event)

def run():
    app = QApplication(sys.argv)
    GUI = CustomDialog()
    GUI.show()
    sys.exit(app.exec_())


run()

观察我使用的是PyQt5,所以如果您需要,只需将导入更改为您正在使用的版本。