【发布时间】:2020-10-22 11:43:42
【问题描述】:
我是一个使用 Qt 和一般构建 GUI 的完整初学者,所以如果这是一个愚蠢的问题,但我在互联网上找不到答案,我深表歉意。我希望你能帮助我解决几个问题:
首先,我使用 Qt Designer 创建了一个 GUI,但在“连接它”时遇到了问题。我有一个包含多种选项的组合框,我想做的是在框中选择更改一堆行编辑框中的文本。问题是,当组合框的textActivated()信号发送到行编辑的setText()槽时,行编辑被组合框中的文本填充。
下面我举一个小例子来说明我的意思。该组合框具有值 A、B 和 C。选择一个选项后,该字母会出现在框中。 我想要做的是让组合框的每个条目成为一个值的“键”,所以如果例如A 被选中,然后用 Option 1 或类似的东西填充行编辑。我想这样做的原因是因为组合框会根据输入设置一堆 default 参数,然后用户可以根据需要tweak .
我知道我需要修改的线路/负责信号/插槽连接的线路是
self.comboBox.textActivated['QString'].connect(self.lineEdit.setText)
但我真的不明白当 .connect 是一个实例函数时我将如何传递组合框的值。
有谁知道如何使用自定义函数/插槽来做到这一点?完整的代码在这篇文章的底部。
第二,一个相关的问题,为什么这些信号/槽会进入窗口的__init__()函数? app.exec_() 是否连续运行 __init__()?实例化一个对象,然后在应用循环中运行一个“更新”函数不是更明智吗?
提前致谢!
完整代码:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'practice.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(493, 124)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.horizontalLayout.addWidget(self.comboBox)
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setObjectName("lineEdit")
self.horizontalLayout.addWidget(self.lineEdit)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 493, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.comboBox.textActivated['QString'].connect(self.lineEdit.setText)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.comboBox.setItemText(0, _translate("MainWindow", "A"))
self.comboBox.setItemText(1, _translate("MainWindow", "B"))
self.comboBox.setItemText(2, _translate("MainWindow", "C"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
【问题讨论】:
标签: python qt user-interface pyqt qt-designer