pyqt:如何使用相同的函数来设置不同qt小部件的文本?
pyqt: How to use a same function to set text of different qt widget?
我对 Qt 和 python 都是新手。对于大多数人来说,这可能是一个简单的问题,但我在 Google 上找不到它。
我有一个表格,包含不同组的 "path and button" 组合。
单击每个路径将打开一个 QFileDialog.getOpenFileName() 对话框,并将 setText 设置为 lineEdit.
我的问题是如何编写这样的函数:
QtCore.QObject.connect(btn1, QtCore.SIGNAL("clicked()"), set_widge_text(lineEdit1))
QtCore.QObject.connect(btn2, QtCore.SIGNAL("clicked()"), set_widge_text(lineEdit2))
QtCore.QObject.connect(btn3, QtCore.SIGNAL("clicked()"), set_widge_text(lineEdit3))
函数中:
def set_widge_text(self, widget_name)
widget_name.setText("self.fname")
def open_file_dialog(self):
fname = QtGui.QFileDialog.getOpenFileName(self, 'Open file',
'./')
self.fname = fname
有什么办法可以实现吗?我不想为不同的 lineEdits 编写不同的 set_widge_text() 集,我们将不胜感激。
非常感谢。
在 Qt 中(抱歉,不熟悉 PyQt)有几件事需要考虑:
首先,你的信号和槽必须采用相同的参数。所以上面的方法是行不通的。 set_widget_text() 必须不带参数,因为 clicked() 不带参数。
您始终可以通过将 sender() 强制转换为适当的 class 来判断是什么 QObject 在槽内发出了信号。在这种情况下,在 Qt 中它将是:
QPushButton* myButton = qobject_cast<QPushButton*>( sender() );
我不确定转换在 PyQt 中如何工作,但应该有类似的解决方案。从那里您应该能够找出要打开的对话框。如果 QPushButton::text() 不起作用,您可以在初始化按钮时使用简单的关联数组将字符串映射到每个按钮。
HTH
使用 lambda
连接信号:
btn1.clicked.connect(lambda: self.set_file_name(lineEdit1))
btn2.clicked.connect(lambda: self.set_file_name(lineEdit2))
btn3.clicked.connect(lambda: self.set_file_name(lineEdit3))
def set_file_name(self, edit):
edit.setText(self.open_file_dialog())
def open_file_dialog(self):
return QtGui.QFileDialog.getOpenFileName(self, 'Open file', './')
我对 Qt 和 python 都是新手。对于大多数人来说,这可能是一个简单的问题,但我在 Google 上找不到它。 我有一个表格,包含不同组的 "path and button" 组合。 单击每个路径将打开一个 QFileDialog.getOpenFileName() 对话框,并将 setText 设置为 lineEdit.
我的问题是如何编写这样的函数:
QtCore.QObject.connect(btn1, QtCore.SIGNAL("clicked()"), set_widge_text(lineEdit1))
QtCore.QObject.connect(btn2, QtCore.SIGNAL("clicked()"), set_widge_text(lineEdit2))
QtCore.QObject.connect(btn3, QtCore.SIGNAL("clicked()"), set_widge_text(lineEdit3))
函数中:
def set_widge_text(self, widget_name)
widget_name.setText("self.fname")
def open_file_dialog(self):
fname = QtGui.QFileDialog.getOpenFileName(self, 'Open file',
'./')
self.fname = fname
有什么办法可以实现吗?我不想为不同的 lineEdits 编写不同的 set_widge_text() 集,我们将不胜感激。
非常感谢。
在 Qt 中(抱歉,不熟悉 PyQt)有几件事需要考虑:
首先,你的信号和槽必须采用相同的参数。所以上面的方法是行不通的。 set_widget_text() 必须不带参数,因为 clicked() 不带参数。
您始终可以通过将 sender() 强制转换为适当的 class 来判断是什么 QObject 在槽内发出了信号。在这种情况下,在 Qt 中它将是:
QPushButton* myButton = qobject_cast<QPushButton*>( sender() );
我不确定转换在 PyQt 中如何工作,但应该有类似的解决方案。从那里您应该能够找出要打开的对话框。如果 QPushButton::text() 不起作用,您可以在初始化按钮时使用简单的关联数组将字符串映射到每个按钮。
HTH
使用 lambda
连接信号:
btn1.clicked.connect(lambda: self.set_file_name(lineEdit1))
btn2.clicked.connect(lambda: self.set_file_name(lineEdit2))
btn3.clicked.connect(lambda: self.set_file_name(lineEdit3))
def set_file_name(self, edit):
edit.setText(self.open_file_dialog())
def open_file_dialog(self):
return QtGui.QFileDialog.getOpenFileName(self, 'Open file', './')