繁体   English   中英

PyQt4信号和插槽-QToolButton

[英]PyQt4 signals and slots - QToolButton

在PyQt4中,我有一个主窗口,单击设置按钮时会打开设置对话框

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)

而settingsStackedWidget是一个QStackedWidget

self.settingsStackedWidget = QtGui.QStackedWidget(SettingsDialog)

在这一点上,我对信号和插槽非常困惑,而且我所读的内容也无法解决所有问题-如果有人可以指出我在上面做错的事情,还可能将我引向有关信号和插槽的良好(初学者)指南/教程将不胜感激

我也想知道如何使setPageIndex如下工作:

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_()

好。 所以这是一个示例,您如何将参数传递给插槽

从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。 当然,您必须从某处获取值,然后将其作为参数放入局部部分(这里我只是使用按钮的文本),但是您可以使用int,bool等。只需注意插槽的签名即可。

这是对我有帮助的教程:http: //zetcode.com/gui/pyqt4/

我希望这有帮助。

嘿,这里有一个完整运行的示例(只需将其复制粘贴到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的方式已经解决了我的问题。 我猜需要指定父窗口??:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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