【问题标题】:How to switch widgets visibility by request如何按请求切换小部件的可见性
【发布时间】:2017-06-11 09:10:41
【问题描述】:

下面的代码创建了一个包含三行小部件的对话框窗口: 一个组合,lineEdit 和 dateEdit。当 combobox 显示“显示 LineEdit”时,我希望 lineEdit 可见,dateEdit 隐藏。 When "Show DateEdit" is selected I would like to hide LineEdit and show DateEdit instead.如何实现?

from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])

class Dialog(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setLayout(QtGui.QVBoxLayout())

        for i in range(3):
            row = QtGui.QHBoxLayout()
            combo = QtGui.QComboBox()
            combo.addItems(['Show LineEdit','Show DateEdit'])
            combo.activated.connect(self.activated)
            row.addWidget(combo)

            self.lineEdit = QtGui.QLineEdit()
            self.dateEdit = QtGui.QDateEdit()
            self.dateEdit.setVisible(False)
            row.addWidget(self.lineEdit)
            row.addWidget(self.dateEdit)
            self.layout().insertLayout(i, row)

    def activated(self):
        print self.sender()

panel=Dialog()
panel.show()
app.exec_()

【问题讨论】:

    标签: python pyqt qcombobox qdialog


    【解决方案1】:

    策略是创建一个字典,以一个组合框为键,以一个对应的其他小部件的字典为值,然后使用可以返回文本或数字的激活方法。

    from PyQt4 import QtGui
    
    app = QtGui.QApplication([])
    
    
    class Dialog(QtGui.QDialog):
        def __init__(self, parent=None):
            super(Dialog, self).__init__(parent)
            self.setLayout(QtGui.QVBoxLayout())
    
            self.widgets = {}
    
            for i in range(3):
                row = QtGui.QHBoxLayout()
                combo = QtGui.QComboBox()
                combo.addItems(['Show LineEdit', 'Show DateEdit'])
                combo.activated[str].connect(self.activated)
                row.addWidget(combo)
    
                lineEdit = QtGui.QLineEdit()
                dateEdit = QtGui.QDateEdit()
    
                self.widgets[combo] = [lineEdit, dateEdit]
    
                self.changeWidget(combo.currentText(), lineEdit, dateEdit)
                row.addWidget(lineEdit)
                row.addWidget(dateEdit)
                self.layout().insertLayout(i, row)
    
        def activated(self, text):
            linedit, dateEdit = self.widgets[self.sender()]
            self.changeWidget(text, linedit, dateEdit)
    
        def changeWidget(self, text, linedit, dateEdit):
            if text == 'Show LineEdit':
                linedit.setVisible(True)
                dateEdit.setVisible(False)
            elif text == 'Show DateEdit':
                linedit.setVisible(False)
                dateEdit.setVisible(True)
    
    
    panel = Dialog()
    panel.show()
    app.exec_()
    

    【讨论】:

      【解决方案2】:

      受上面发布的 eyllanesc 答案的启发,但没有字典。

      from PyQt4 import QtGui
      app = QtGui.QApplication([])
      
      class Dialog(QtGui.QDialog):
          def __init__(self, parent=None):
              super(Dialog, self).__init__(parent)
              self.setLayout(QtGui.QVBoxLayout())
      
              for i in range(3):
                  row = QtGui.QHBoxLayout()
                  combo = QtGui.QComboBox()
                  combo.addItems(['Show LineEdit', 'Show DateEdit'])
                  combo.activated[str].connect(self.activated)
                  row.addWidget(combo)
      
                  combo.lineEdit = QtGui.QLineEdit()
                  combo.dateEdit = QtGui.QDateEdit()
      
                  row.addWidget(combo.lineEdit)
                  row.addWidget(combo.dateEdit)
                  self.layout().insertLayout(i, row)
      
          def activated(self, title):
              combo = self.sender()
              if title == 'Show LineEdit':
                  combo.lineEdit.setVisible(True)
                  combo.dateEdit.setVisible(False)
              else:
                  combo.lineEdit.setVisible(False)
                  combo.dateEdit.setVisible(True)
      
      panel = Dialog()
      panel.show()
      app.exec_()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-19
        • 2013-05-13
        • 2020-04-10
        • 2014-01-10
        • 2011-12-15
        • 2012-04-28
        • 2011-04-08
        • 1970-01-01
        相关资源
        最近更新 更多