2016-11-10 91 views
1

没有那么多经验PyQt的所有..调整大小QDialog的单选按钮时,被经过的PyQt

我设计了Qt设计的UI有2个单选按钮。

取决于所选择的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() 

肯定的代码可以改善(不如此熟练的代码编写)...

回答

0

你只需要set_up你的用户界面来在需要时调整大小。 有很多更漂亮的方式做到这一点,但这里是一个简单而快速的例子:

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

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,所以如果你需要你只是爱改变你的进口,以您正在使用的版本。

+0

另请参阅我正在使用paintEvent来保持游戏非常好,因为paintEvent在主线程中,它在不断执行。更好的方法是拥有自己的定制单选按钮并覆盖它的“改变”方法。如果它改变了,你会调整你的对话框。像这样的^^ – yurisnm

+0

嗨..谢谢你的回答,非常完整..但是,如果我理解正确,你建议设置对话框大小“手动”吧?我正在寻找一种知道布局的新维度的方法,当一些小部件不再可见时。 – matteo

+0

是的,你是正确的,只是让我的代码,并让它运行。取出setFixedSize。如果你手动调整它的大小,当你标记大的收音机时它仍然会增长,而小的收音机仍然会减少。我做的只是众多例子之一。 “) – yurisnm