如何根据请求切换小部件可见性

How to switch widgets visibility by request

下面的代码创建了一个包含三行小部件的对话框 window: 一个组合,lineEdit 和 dateEdit。当 combobox 显示 'Show LineEdit' 时,我希望 lineEdit 可见,而 dateEdit 隐藏。选择 "Show DateEdit" 时,我想隐藏 LineEdit 并改为显示 DateEdit。如何实现?

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_()

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

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_()

受到上面发布的 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_()