PyQt4 信号和槽 - QToolButton
PyQt4 signals and slots - QToolButton
在 PyQt4 中我有一个主要的 window 当点击设置按钮时打开设置对话框
from PyQt4 import QtCore, QtGui
import ui_Design, ui_Settings_Design
class MainDialog(QtGui.QMainWindow, ui_Design.Ui_arbCrunchUI):
def __init__(self, parent=None):
super(MainDialog, self).__init__(parent)
self.setupUi(self)
self.settingsBtn.clicked.connect(lambda: self.showSettings())
def showSettings(self):
dialog = QtGui.QDialog()
dialog.ui = SettingsDialog()
dialog.ui.setupUi(dialog)
dialog.exec_()
上面的工作正常并且显示了我的 SettingsDialog 但我无法让 setPageIndex 工作
class SettingsDialog(QtGui.QDialog, ui_Settings_Design.Ui_SettingsDialog):
def __init__(self, parent=None):
super(SettingsDialog, self).__init__(parent)
self.setupUi(self)
self.bookSettingsBtn.clicked.connect(self.setPageIndex)
@QtCore.pyqtSlot()
def setPageIndex(self):
print 'selected'
self.settingsStackedWidget.setCurrentIndex(0)
bookSettingsBtn 是一个 QToolButton
self.bookSettingsBtn = QtGui.QToolButton(self.navigationFrame)
并且settingStackedWidget是一个QStackedWidget
self.settingsStackedWidget = QtGui.QStackedWidget(SettingsDialog)
在这一点上,我对信号和插槽感到非常困惑,而且我所读的任何内容都无法解决这个问题 - 如果有人可以指出我在上面做错了什么,并且还可能指导我找到一个好的(初学者)指南/教程在信号和插槽上,将不胜感激
我也想知道如何让 setPageIndex 工作如下:
def setPageIndex(self, selection):
self.settingsStackedWidget.setCurrentIndex(selection)
好的。所以这是一个如何将参数传递给 slot
的示例
从 functools 导入部分
# here you have a button bookSettingsBtn:
self.bookSettingsBtn = QtGui.QPushButton("settings")
self.bookSettingsBtn.clicked.connect(partial(self.setPageIndex, self.bookSettingsBtn.text()))
@pyqtSlot(str) # this means the function expects 1 string parameter (str, str) 2 string parameters etc.
def setPageIndex(self, selection):
print "you pressed button " + selection
在你的例子中,参数是一个整数。当然你必须从某个地方获得价值
然后把它作为参数放在部分部分(这里我只是使用了按钮的文本),
但你可以使用 int、bool 等。只看插槽签名。
这是一个对我有帮助的教程:
http://zetcode.com/gui/pyqt4/
希望对您有所帮助。
嘿,我这里有一个完整的 运行ning 示例(只需将其复制粘贴到 python 文件中,然后 运行 它):
也许这对你有帮助。这是一个小例子,但在这里你可以看到它是如何工作的。
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from functools import partial
class MyForm(QMainWindow):
def __init__(self, parent=None):
super(MyForm, self).__init__(parent)
button1 = QPushButton('Button 1')
button2 = QPushButton('Button 2')
button1.clicked.connect(partial(self.on_button, button1.text()))
button2.clicked.connect(partial(self.on_button, button1.text()))
layout = QHBoxLayout()
layout.addWidget(button1)
layout.addWidget(button2)
main_frame = QWidget()
main_frame.setLayout(layout)
self.setCentralWidget(main_frame)
@pyqtSlot(str)
def on_button(self, n):
print "Text of button is: " + str(n)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
form = MyForm()
form.show()
app.exec_()
所以我不太明白为什么,但是更改从 MainWindow 调用 settingsDialog 的方式已经解决了我的问题。我想需要指定父级 window??:
class MainDialog(QtGui.QMainWindow, ui_Design.Ui_arbCrunchUI):
....
def showSettings(self):
self.settingsDialog = QtGui.QDialog(self)
self.settingsDialog.ui = SettingsDialog(self)
self.settingsDialog.ui.show()
class SettingsDialog(QtGui.QDialog, ui_Settings_Design.Ui_SettingsDialog):
def __init__(self, parent=None):
super(SettingsDialog, self).__init__(parent)
self.setupUi(self)
self.bookSettingsBtn.clicked.connect(partial(self.setPageIndex, 1))
@QtCore.pyqtSlot(int)
def setPageIndex(self, selection):
self.settingsStackedWidget.setCurrentIndex(selection)
我不确定您为什么要执行以下操作,但这就是问题所在:
def showSettings(self):
dialog = QtGui.QDialog()
dialog.ui = SettingsDialog()
dialog.ui.setupUi(dialog)
dialog.exec_()
SettingsDialog
本身就是一个合适的QDialog
。您不需要实例化另一个 QDialog
。
现在,您正在创建一个空的 QDialog
,然后用与 SettingsDialog
相同的 ui(即 setupUi(dialog)
)填充它,然后您显示这个对话。但是...信号连接用于 SettingsDialog
,而您显示的对话框没有。
基本上,您根本不需要额外的 QDialog
。以下应该足够了:
def showSettings(self):
dialog = SettingsDialog()
dialog.exec_()
在 PyQt4 中我有一个主要的 window 当点击设置按钮时打开设置对话框
from PyQt4 import QtCore, QtGui
import ui_Design, ui_Settings_Design
class MainDialog(QtGui.QMainWindow, ui_Design.Ui_arbCrunchUI):
def __init__(self, parent=None):
super(MainDialog, self).__init__(parent)
self.setupUi(self)
self.settingsBtn.clicked.connect(lambda: self.showSettings())
def showSettings(self):
dialog = QtGui.QDialog()
dialog.ui = SettingsDialog()
dialog.ui.setupUi(dialog)
dialog.exec_()
上面的工作正常并且显示了我的 SettingsDialog 但我无法让 setPageIndex 工作
class SettingsDialog(QtGui.QDialog, ui_Settings_Design.Ui_SettingsDialog):
def __init__(self, parent=None):
super(SettingsDialog, self).__init__(parent)
self.setupUi(self)
self.bookSettingsBtn.clicked.connect(self.setPageIndex)
@QtCore.pyqtSlot()
def setPageIndex(self):
print 'selected'
self.settingsStackedWidget.setCurrentIndex(0)
bookSettingsBtn 是一个 QToolButton
self.bookSettingsBtn = QtGui.QToolButton(self.navigationFrame)
并且settingStackedWidget是一个QStackedWidget
self.settingsStackedWidget = QtGui.QStackedWidget(SettingsDialog)
在这一点上,我对信号和插槽感到非常困惑,而且我所读的任何内容都无法解决这个问题 - 如果有人可以指出我在上面做错了什么,并且还可能指导我找到一个好的(初学者)指南/教程在信号和插槽上,将不胜感激
我也想知道如何让 setPageIndex 工作如下:
def setPageIndex(self, selection):
self.settingsStackedWidget.setCurrentIndex(selection)
好的。所以这是一个如何将参数传递给 slot
的示例从 functools 导入部分
# here you have a button bookSettingsBtn:
self.bookSettingsBtn = QtGui.QPushButton("settings")
self.bookSettingsBtn.clicked.connect(partial(self.setPageIndex, self.bookSettingsBtn.text()))
@pyqtSlot(str) # this means the function expects 1 string parameter (str, str) 2 string parameters etc.
def setPageIndex(self, selection):
print "you pressed button " + selection
在你的例子中,参数是一个整数。当然你必须从某个地方获得价值 然后把它作为参数放在部分部分(这里我只是使用了按钮的文本), 但你可以使用 int、bool 等。只看插槽签名。
这是一个对我有帮助的教程: http://zetcode.com/gui/pyqt4/
希望对您有所帮助。
嘿,我这里有一个完整的 运行ning 示例(只需将其复制粘贴到 python 文件中,然后 运行 它): 也许这对你有帮助。这是一个小例子,但在这里你可以看到它是如何工作的。
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from functools import partial
class MyForm(QMainWindow):
def __init__(self, parent=None):
super(MyForm, self).__init__(parent)
button1 = QPushButton('Button 1')
button2 = QPushButton('Button 2')
button1.clicked.connect(partial(self.on_button, button1.text()))
button2.clicked.connect(partial(self.on_button, button1.text()))
layout = QHBoxLayout()
layout.addWidget(button1)
layout.addWidget(button2)
main_frame = QWidget()
main_frame.setLayout(layout)
self.setCentralWidget(main_frame)
@pyqtSlot(str)
def on_button(self, n):
print "Text of button is: " + str(n)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
form = MyForm()
form.show()
app.exec_()
所以我不太明白为什么,但是更改从 MainWindow 调用 settingsDialog 的方式已经解决了我的问题。我想需要指定父级 window??:
class MainDialog(QtGui.QMainWindow, ui_Design.Ui_arbCrunchUI):
....
def showSettings(self):
self.settingsDialog = QtGui.QDialog(self)
self.settingsDialog.ui = SettingsDialog(self)
self.settingsDialog.ui.show()
class SettingsDialog(QtGui.QDialog, ui_Settings_Design.Ui_SettingsDialog):
def __init__(self, parent=None):
super(SettingsDialog, self).__init__(parent)
self.setupUi(self)
self.bookSettingsBtn.clicked.connect(partial(self.setPageIndex, 1))
@QtCore.pyqtSlot(int)
def setPageIndex(self, selection):
self.settingsStackedWidget.setCurrentIndex(selection)
我不确定您为什么要执行以下操作,但这就是问题所在:
def showSettings(self):
dialog = QtGui.QDialog()
dialog.ui = SettingsDialog()
dialog.ui.setupUi(dialog)
dialog.exec_()
SettingsDialog
本身就是一个合适的QDialog
。您不需要实例化另一个 QDialog
。
现在,您正在创建一个空的 QDialog
,然后用与 SettingsDialog
相同的 ui(即 setupUi(dialog)
)填充它,然后您显示这个对话。但是...信号连接用于 SettingsDialog
,而您显示的对话框没有。
基本上,您根本不需要额外的 QDialog
。以下应该足够了:
def showSettings(self):
dialog = SettingsDialog()
dialog.exec_()