2010-03-17 128 views
4

我無法理解由pyuic4主要使用的connectSlotsByName()方法。目前爲止,PyQt文件中的類是單一的,因爲我們可以使用self,它將與整個單個對象相關聯..但是,我們試圖用各種類別的不同文件中的問題,並使用connectSlotsByName(需要)出現..這是我遇到的這是奇怪..瞭解pyqt中connectSlotsByName()的問題?

我創建了一個堆疊部件..

  • 我放置我的第一個小工具..它 有一個名爲「下一步>」的按鈕。

  • 單擊[下一步]它隱藏當前 小部件,並增加了其具有「點擊我」按鈕,另一小..

這裏的問題是單擊事件「點擊我」在第二個按鈕這是一個最小的例子,我可以給我原來的問題..請幫助我..

這是文件1 ..(它有父母堆疊的小部件,它是第一頁)。單擊[下一步]它增加了第二頁,其中有文件2「clickme」按鈕..

from PyQt4 import QtCore, QtGui 

import file2 

class Ui_StackedWidget(QtGui.QStackedWidget): 

    def __init__(self,parent=None): 

     QtGui.QStackedWidget.__init__(self,parent) 

     self.setObjectName("self") 
     self.resize(484, 370) 
     self.setWindowTitle(QtGui.QApplication.translate("self", "stacked widget", None, QtGui.QApplication.UnicodeUTF8)) 

     self.createWidget1() 

    def createWidget1(self): 

     self.page=QtGui.QWidget() 
     self.page.setObjectName("widget1") 


     self.pushButton=QtGui.QPushButton(self.page)   
     self.pushButton.setGeometry(QtCore.QRect(150, 230, 91, 31)) 
     self.pushButton.setText(QtGui.QApplication.translate("self", "Next >", None, QtGui.QApplication.UnicodeUTF8)) 


     self.addWidget(self.page) 


     QtCore.QMetaObject.connectSlotsByName(self.page) 

      QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL('clicked()'),self.showWidget2) 


    def showWidget2(self): 

     self.page.hide() 

     obj=file2.widget2() 
     obj.createWidget2(self) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    ui = Ui_StackedWidget() 
    ui.show() 
    sys.exit(app.exec_()) 

這裏的文件2

from PyQt4 import QtGui,QtCore 

class widget2(): 

    def createWidget2(self,parent): 

     self.page = QtGui.QWidget() 
     self.page.setObjectName("page") 

     self.parent=parent 

     self.groupBox = QtGui.QGroupBox(self.page) 
     self.groupBox.setGeometry(QtCore.QRect(30, 20, 421, 311)) 
     self.groupBox.setObjectName("groupBox") 
     self.groupBox.setTitle(QtGui.QApplication.translate("self", "TestGroupBox", None, QtGui.QApplication.UnicodeUTF8)) 

     self.pushButton = QtGui.QPushButton(self.groupBox) 
     self.pushButton.setGeometry(QtCore.QRect(150, 120, 92, 28)) 
     self.pushButton.setObjectName("pushButton") 
     self.pushButton.setText(QtGui.QApplication.translate("self", "Click Me", None, QtGui.QApplication.UnicodeUTF8))   

     self.parent.addWidget(self.page) 
     self.parent.setCurrentWidget(self.page) 

     QtCore.QMetaObject.connectSlotsByName(self.page) 

     QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL('clicked()'),self.printMessage) 


    def printMessage(self): 

     print("Hai") 

雖然在這兩個小部件(我的意思頁)

QtCore.QMetaObject.connectSlotsByName(self.page) 

第二個對話框中的點擊信號沒有得到處理。在此先感謝..可能是一個初學者的問題..

回答

2

你不需要撥打connectSlotsByName(),只是刪除這些行。

file2,呼籲QtCore.QMetaObject.connectSlotsByName(self.page)試圖做到這一點:

QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL('clicked()'), self.on_pushButton_clicked()) 

因爲self.on_pushBotton_clicked()插槽沒有確定的,不會爲你工作。 我發現在PyQt中創建自己的連接是最容易的...我建議從兩個類中刪除對connectSlotsByName的調用...您不需要它。

此外,您的wdiget1類應該設置它的pushButton的名稱(最好是其他「pushButton」以避免與widget2中的按鈕混淆)。

1

非常感謝你jcoon的回覆。但很長一段時間後,敲我的頭靠在牆上我找到了解決辦法..

的問題是..

self.obj=test_reuse_stacked1.widget2() 
self.obj.createWidget2(self) 

代替OBJ ..

3

起初,這裏是最小的工作例如:當你想通過名稱插槽連接

from sys import argv, exit 
from PyQt4 import QtCore, QtGui 

class widget2(QtGui.QWidget): 

    def __init__(self, args): 
     self.app = MainApp(args) 
     QtGui.QWidget.__init__(self) 
     self.setObjectName('I') 

     self._layout = QtGui.QVBoxLayout(self) 
     self.setLayout(self._layout) 

     self.pushButtoninWidget2 = QtGui.QPushButton(self) 
     self.pushButtoninWidget2.setObjectName("pushButtoninWidget2") 
     self.pushButtoninWidget2.setText('Click NOW!') 
     self._layout.addWidget(self.pushButtoninWidget2) 

     QtCore.QMetaObject.connectSlotsByName(self) 

    @QtCore.pyqtSlot() 
    def on_pushButtoninWidget2_clicked(self): 
     print("Hai") 

class MainApp(QtGui.QApplication): 
    def __init__(self, args): 
     QtGui.QApplication.__init__(self, args) 

if __name__ == "__main__": 
    main = widget2(argv) 
    main.show() 
    exit(main.app.exec_()) 

,你必須通過調用給予適當的名稱插槽,然後有人(MOC,UIC,或者你connectSlotsByName)必須連接它們。這種插槽的正確名稱是:「on_PyQtObjectName_PyQtSignalName」。請注意,如果我在示例中省略了@ QtCore.pyqtSlot(),則對於每個適當的過載(本例中爲兩次),插槽將執行一次。

你需要直接調用connectSlotsByNames,因爲沒有moc,當你在C++中使用QT時,它會爲你做,而且你不使用uic和.ui文件。如果你想隱式連接插槽(我總是這樣做,除了插槽,直接連接到.ui),你最好使用更多的pytonish語法:button.clicked.connect(self._mySlot)。

而且看看http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#connecting-slots-by-name

+0

由於最大..它幫助了我很多理解的概念.. – Jeba 2010-03-25 05:07:25

+0

這是一個非常明確的和有用的解釋。 +1 – umbe1987 2017-12-12 20:33:05

2

一個更好的問題是「爲什麼不直接使用新式信號和槽?」。他們是更簡單,並且不需要任何奇怪的命名約定:

from sys import argv, exit 
from PyQt4 import QtCore, QtGui 

class MyWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(MyWidget, self).__init__(parent) 

     self._layout = QtGui.QVBoxLayout() 
     self.setLayout(self._layout) 

     self._button = QtGui.QPushButton() 
     self._button.setText('Click NOW!') 
     self._layout.addWidget(self._button) 

     self._button.clicked.connect(self._printMessage) 

    @QtCore.pyqtSlot() 
    def _printMessage(self): 
     print("Hai") 

if __name__ == "__main__": 
    app = QtGui.QApplication(argv) 

    main = MyWidget() 
    main.show() 
    exit(app.exec_()) 
+0

感謝您的回覆。我會仔細研究它.. – Jeba 2010-04-12 10:53:48