alphanumeric
alphanumeric

Reputation: 19329

How to switch widgets visibility by request

The code below creates a single dialog window with three rows of widgets: a combo, lineEdit and dateEdit. When combobox shows 'Show LineEdit' I would like lineEdit to be visible and dateEdit to be hidden. When "Show DateEdit" is selected I would like to hide LineEdit and show DateEdit instead. How to achieve it?

enter image description here

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

Upvotes: 1

Views: 84

Answers (2)

alphanumeric
alphanumeric

Reputation: 19329

Inspired by eyllanesc answer posted above but with no dictionary.

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

Upvotes: 0

eyllanesc
eyllanesc

Reputation: 243897

The strategy is to create a dictionary that has as a key a combobox and values ​​a dictionary of the corresponding other widget, then use the activated method that can return a text or a number.

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

Upvotes: 1

Related Questions