简体   繁体   中英

PyQt4 - QLineEdit() and QCheckbox()

I am building a GUI for obtaining user inputs and then using them in some complex step later. I have a group of checkboxes from which the user has to choose at least one and also provide an 'alias' name for it in the QLineEdit right below the checkbox (default name is taken otherwise).

Currently, I have to first enter the alias name and then check the checkbox to register the entered name in the line edit to get the value entered by the user and connected checkbox name. This order is not normal. Is there a way to get the Editline data and the connected checkbox name when 'Continue' is clicked?

Here is my code:

from PyQt4 import QtGui, QtCore
import sys

checkpoint_list = ['Amsterdam','Munich','Paris','Mumbai']


class MyGui(QtGui.QWidget):
    def __init__(self):
        super(MyGui, self).__init__()
        self.initUI()
        self.final_list = []
        self.platform_list = {}
        self.qem = None

    def initUI(self):

        lay_out = QtGui.QVBoxLayout(self)

        # select the CPs
        cp_lbl = QtGui.QLabel("Please select CP versions to compare:", self)
        lay_out.addWidget(cp_lbl)
        self.cb = []
        self.platform_label = []

        i = 0
        for cp in checkpoint_list:
            self.cb.append(QtGui.QCheckBox(cp, self))
            self.platform_label.append(QtGui.QLineEdit(cp, self))
            self.cb[i].stateChanged.connect(self.clickBoxStateChanged)
            lay_out.addWidget(self.cb[i])
            lay_out.addWidget(self.platform_label[i])
            i += 1
        lay_out.addStretch(10)

        # Continue and cancel button
        btn_cancel = QtGui.QPushButton('Cancel', self)
        btn_continue = QtGui.QPushButton('Continue', self)

        hbox = QtGui.QHBoxLayout()
        hbox.addStretch()
        hbox.addWidget(btn_continue)
        hbox.addWidget(btn_cancel)

        vbox = QtGui.QVBoxLayout()
        vbox.addStretch()

        lay_out.addLayout(hbox)
        lay_out.addLayout(vbox)

        self.setLayout(lay_out)

        btn_cancel.clicked.connect(self.onclick_cancel)
        btn_cancel.setToolTip('To <b>Cancel</b> with this process')

        btn_continue.clicked.connect(self.onclick_Continue)
        btn_continue.setToolTip('To <b>Continue</b> with the matching')

        # Screen show
        self.setGeometry(300, 300, 500, 400)
        self.setWindowTitle('CP Selection Window')
        self.show()

    def clickBoxStateChanged(self, cb):
        self.final_list = []
        self.platform_list = {}
        for i in range(len(self.cb)):
            if self.cb[i].isChecked():
                if self.cb[i] not in self.final_list:
                    self.final_list.append(str(self.cb[i].text()))
                    self.platform_list[str(self.cb[i].text())] = str(self.platform_label[i].text())
                    print self.final_list
                    print self.platform_list
            elif self.cb[i].isChecked() == False:
                if self.cb[i].text() in self.final_list:
                    self.final_list.remove(str(self.cb[i].text()))
                    del self.platform_list[str(self.cb[i].text())]
                    print self.final_list
                    print self.platform_list

    def onclick_Continue(self):
        try:
            if len(self.final_list) == 0:
                self.qem = QtGui.QErrorMessage(self)
                self.qem.showMessage("Please select at least 1 checkpoint to continue...")
            else:
                self.close()
        except:
            print "No CP was selected..."

    def onclick_cancel(self):
        sys.exit()


if __name__ == "__main__":

    # GUI code
    app = QtGui.QApplication(sys.argv)
    w = MyGui()
    app.exec_()

The simplest solution is to create a method that analyzes the information and that returns a dictionary of the selected elements:

class MyGui(QtGui.QWidget):
    def __init__(self):
        super(MyGui, self).__init__()
        self.initUI()

    def initUI(self):

        lay_out = QtGui.QVBoxLayout(self)

        # select the CPs
        cp_lbl = QtGui.QLabel("Please select CP versions to compare:")
        lay_out.addWidget(cp_lbl)
        self.cb = []
        self.platform_label = []

        for cp in checkpoint_list:
            cb = QtGui.QCheckBox(cp)
            le = QtGui.QLineEdit(cp)
            lay_out.addWidget(cb)
            lay_out.addWidget(le)

            self.cb.append(cb)
            self.platform_label.append(le)

        lay_out.addStretch(10)

        # Continue and cancel button
        btn_cancel = QtGui.QPushButton("Cancel")
        btn_continue = QtGui.QPushButton("Continue")

        hbox = QtGui.QHBoxLayout()
        hbox.addStretch()
        hbox.addWidget(btn_continue)
        hbox.addWidget(btn_cancel)

        vbox = QtGui.QVBoxLayout()
        vbox.addStretch()

        lay_out.addLayout(hbox)
        lay_out.addLayout(vbox)

        btn_cancel.clicked.connect(self.onclick_cancel)
        btn_cancel.setToolTip("To <b>Cancel</b> with this process")

        btn_continue.clicked.connect(self.onclick_Continue)
        btn_continue.setToolTip("To <b>Continue</b> with the matching")

        # Screen show
        self.setGeometry(300, 300, 500, 400)
        self.setWindowTitle("CP Selection Window")
        self.show()

    def get_elements_selected(self):
        values_selected = dict()

        for cb, le in zip(self.cb, self.platform_label):
            if cb.isChecked():
                values_selected[cb.text()] = le.text()
        return values_selected

    def onclick_Continue(self):
        values = self.get_elements_selected()
        if values:
            print(values)
            self.close()
        else:
            qem = QtGui.QErrorMessage(self)
            qem.showMessage("Please select at least 1 checkpoint to continue...")
            qem.exec_()

    def onclick_cancel(self):
        sys.exit()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM