python - 获取第二个窗口,将变量传递给主 ui 并关闭

标签 python pyqt pyqt5 qdialog

我试图从列表中选择一个变量发送回主窗口,然后在按下“确定”按钮时关闭第二个窗口。目前第二个窗口不会关闭。任何帮助将不胜感激。

代码:

class select_variable_window(QDialog):
    def __init__(self, list, parent=None):
        super().__init__(parent)
        self.label = QtWidgets.QLabel(self)
        self.label.setGeometry(QtCore.QRect(20, 10, 251, 16))
        self.label.setObjectName("label")
        self.label=QLabel("Select Variable for Scatterplot", self)

        self.dialogbutton = QtWidgets.QDialogButtonBox(self)
        self.dialogbutton.setGeometry(QtCore.QRect(120, 260, 161, 32))
        self.dialogbutton.setOrientation(QtCore.Qt.Horizontal)
        self.dialogbutton.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.dialogbutton.setObjectName("dialogbutton")

        self.variablelist = QtWidgets.QListWidget(self)
        self.variablelist.setGeometry(QtCore.QRect(10, 30, 391, 221))
        self.variablelist.setObjectName("variablelist")
        self.variablelist.setSelectionMode(QAbstractItemView.SingleSelection)
        self.variablelist.addItems(list)

        self.dialogbutton.accepted.connect(self.accept)
        self.dialogbutton.rejected.connect(self.reject)
        QtCore.QMetaObject.connectSlotsByName(self)

    def accept(self):
        self.scattervariable=[item.text() for item in self.variablelist.selectedItems()]
        print(self.scattervariable)
        self.close()# wont close
        return

    def reject(self):
        self.close()#wont close
        return

最佳答案

首先不要使用 list 作为变量的名称,因为它是保留字,这样做被认为是一种不好的做法,将来可能会带来问题。

另一方面 accept() 是一种关闭窗口并给出返回代码 QDialog.Accepted 的方法,但您正在覆盖它并阻止它执行它的工作,所以在完成你的逻辑之后,你必须调用父级的方法来完成他的典型关闭并建立一个返回代码。

另一方面,建议类名称以大写字母开头,请阅读 PEP8 了解更多信息。另一方面,我建议学习使用布局来确定元素的位置。

from PyQt5 import QtCore, QtWidgets

class Select_variable_window(QtWidgets.QDialog):
    def __init__(self, items, parent=None):
        super().__init__(parent)
        lay = QtWidgets.QVBoxLayout(self)

        label = QtWidgets.QLabel("Select Variable for Scatterplot:")

        self.variablelist = QtWidgets.QListWidget()
        self.variablelist.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
        self.variablelist.addItems(items)

        dialogbutton = QtWidgets.QDialogButtonBox()
        dialogbutton.setOrientation(QtCore.Qt.Horizontal)
        dialogbutton.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)

        lay.addWidget(label)
        lay.addWidget(self.variablelist)
        lay.addWidget(dialogbutton)

        dialogbutton.accepted.connect(self.accept)
        dialogbutton.rejected.connect(self.reject)

    def accept(self):
        self.scattervariable = [item.text() for item in self.variablelist.selectedItems()]
        super().accept() # <-- call parent method


class FirstWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        lay = QtWidgets.QVBoxLayout(self)
        button = QtWidgets.QPushButton("Open Dialog")
        button.clicked.connect(self.on_clicked)
        lay.addWidget(button)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        w = Select_variable_window(["1", "2", "3", "4"])
        if w.exec_() == QtWidgets.QDialog.Accepted:
            print(w.scattervariable)

if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = FirstWidget()
    w.show()
    sys.exit(app.exec_())

关于python - 获取第二个窗口,将变量传递给主 ui 并关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52560496/

相关文章:

python - 在pyqt5的水平布局中正确拉伸(stretch)小部件

python - QApplication() 和 QWidget() 对象如何在 PySide/PyQt 中连接?

python - 为什么我无法使用 Keras 预测 y=x**4? (y=x**3 有效)

Python pandas 加入覆盖

python - 从 PyQt 中的 QTableWidget 中删除水平网格线

python - 无法在 QML TableView 中显示来自 QSqlQueryModel 的数据

GUI 和控制台上的 python 日志输出

python - pyqt向导将字段注册为字符串而不是整数

python - 如何在 python 中格式化 LaTeX 字符串?

python - 类型错误 : QPixmap(): argument 1 has unexpected type 'Figure'