5

私はPythonとPyQtを学び始めています。現在、QDesigner から生成されたダイアログ フォームを使用して、信号とスロットの接続に関する非常に基本的な問題と戦っています。QDialog からプッシュボタンを接続したい。コードはエラーを生成しません。期待どおり、ダイアログが表示されます。しかし、プッシュボタンをクリックしても何も起こりません。

Ui_Dialogまたは、コードフォームをターゲットクラスに直接含めようとしましたTestdialog。その後、接続は機能していました。ダイアログを実行したいから、および/または方法でUi_Dialogプロパティを継承する際にエラーが発生したようです。Testdialog

私の主なプログラムは次のようになります。

from __future__ import unicode_literals
import sys

from PyQt4 import *
from PyQt4 import QtGui
from PyQt4.QtCore import SIGNAL, QObject

import UI_Test



class Testdialog(QtGui.QDialog, UI_Test.Ui_Dialog):
    def __init__(self,parent=None):
        super(Testdialog, self).__init__(parent)
        self.setupUi(self)
        print("Connect buttons") # gives the expected output

        self.connect(self.pushButton_Ok, SIGNAL("clicked()"), self.clickedOk)
        self.connect(self.pushButton_Cancel, SIGNAL("clicked()"), self.clickedCancel)

        # Alternativly I have tríed the following without improvement:
        # self.pushButton_Ok.clicked.connect(self.clickedOk)
        # QObject.connect(self.pushButton_Cancel, SIGNAL("clicked()"), self.clickedCancel)


    def clickedCancel(self):
        print ("Cancel")  # Question: Why is nothing happening here?


    def clickedOk(self):
        print ("Ok")       # Question: Why is nothing happening here?



if True:
    qApp = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    u = Testdialog()
    u.setupUi(Dialog)
    Dialog.exec_()
    sys.exit(qApp.exec_())

ブッシュボタンをクリックしても何も起こりません。接続が機能していないようです。

私は何を間違えましたか?どのように修正しますか?他に何を改善する必要がありますか?

フォームUI_Test.pyは QtDesigner と pyuic で自動的に生成されるため、特別なものではありません。したがって、基本的には問題ないはずです (ただし、コードの詳細はすべて理解していません)。実行例を提供するために、コードは次のとおりです。

# File: UI_Test.py
from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(271, 70)
        self.pushButton_Ok = QtGui.QPushButton(Dialog)
        self.pushButton_Ok.setGeometry(QtCore.QRect(20, 20, 93, 28))
        self.pushButton_Ok.setObjectName(_fromUtf8("pushButton_Ok"))
        self.pushButton_Cancel = QtGui.QPushButton(Dialog)
        self.pushButton_Cancel.setGeometry(QtCore.QRect(130, 20, 93, 28))
        self.pushButton_Cancel.setObjectName(_fromUtf8("pushButton_Cancel"))

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.pushButton_Ok.setText(_translate("Dialog", "OK", None))
        self.pushButton_Cancel.setText(_translate("Dialog", "Cancel", None))
4

2 に答える 2

5

元のコードの問題は、このセクションにあります。

if True:
    qApp = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    u = Testdialog()
    u.setupUi(Dialog)
    Dialog.exec_()
    sys.exit(qApp.exec_())

代わりに、次のようなものが必要です。

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    u = Testdialog()
    u.show()
    sys.exit(app.exec_())

元のコードが機能しない理由は、信号接続が of でのみ行われるため__init__ですTestdialog。作成したインスタンスにTestdialogはすべての ui が追加されており、すべての信号が正しく接続されていますが、実際には表示されません! 代わりに、作成した別のダイアログ (つまりDialog) を表示します。このダイアログには、同じ UI の新しいコピーが ( 経由でsetupUi) 追加されますが、信号接続はありません。

于 2015-01-13T02:54:04.907 に答える
1

ねえ、これが私の答えです。QtDesigner を使用せずに同じ例を作成しました (コピーして貼り付けて実行するだけです)。

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.Qt import pyqtSlot

class MyDialog(QtGui.QDialog):
    def __init__(self):
        super(MyDialog, self).__init__()
        self.resize(271, 70)
        self.pushButton_Ok = QtGui.QPushButton(self)
        self.pushButton_Ok.setGeometry(QtCore.QRect(20, 20, 93, 28))
        self.pushButton_Ok.setText("Ok")

        self.pushButton_Cancel = QtGui.QPushButton(self)
        self.pushButton_Cancel.setGeometry(QtCore.QRect(130, 20, 93, 28))
        self.pushButton_Cancel.setText("Cancel")

        # HERE the slots are connected
        self.pushButton_Ok.clicked.connect(self.clickedOk) # new style signal/slot
        self.pushButton_Cancel.clicked.connect(self.clickedCancel) # new style signal/slot

    @pyqtSlot()
    def clickedCancel(self):
        print ("Cancel pressed")

    @pyqtSlot()
    def clickedOk(self):
        print ("Ok pressed")

qApp = QtGui.QApplication(sys.argv)
dial = MyDialog()
dial.show()
sys.exit(qApp.exec_())

QtDesigner を使用しないという意味が理解できたと思います。この例のように、はるかに明確でコードが少なく、バックグラウンドで何が起こっているかをよりよく理解できるからです。私の答えがお役に立てば幸いです。

于 2015-01-13T01:34:11.450 に答える