2

Qt Designer でQDialogウィンドウを作成し、それを使用pysideuicして、すべての GUI 要素を初期化するメソッドを含む基本クラスにコンパイルしsetupUi、機能を実装するために拡張しました。

class MyDialog(QtGui.QDialog, ui_file.Ui_main_dialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        ui_file.Ui_main_dialog.__init__(self)
        self.setupUi(self)

このsetupUiメソッドにはQtCore.QObject.connect、Qt Designer で作成したシグナル スロット接続の呼び出しが含まれており、GUI に新しいスロットも追加しました。これらのスロットは、によって生成された基本クラスには存在しないため、クラスpysideuicに追加しました。MyDialog

    def on_list_selection_changed(self):
        self.run_btn.setEnabled(len(self.modules_list.selectedIndexes()) > 0)

この例では、スロットはon_list_selection_changed()Qt Designer で (空のパラメーター リストで) 呼び出されます。

初期化時に、MyDialog.__init__が呼び出さUi_main_dialog.setupUiれ、最終的に呼び出されますQtCore.QMetaObject.connectSlotsByName(後者の 2 つは現在作成中のMyDialogインスタンスと一緒です)。selfこれにより、次の行が出力されsys.stderrます。

QMetaObject::connectSlotsByName: No matching signal for on_list_selection_changed()

それでも、信号は正しく動作し、接続されたmodules_list.itemSelectionChanged()(modules_listQListWidget) のときにスロットが呼び出されます。

ここに私の質問があります: なぜこの警告が表示されるのですか? 関係ないように見えるので、表示されないようにするにはどうすればよいですか?


編集:過去5か月間回答がなかったので、問題を簡単に再現できるように完全な例を挙げようと思いました.

この例は、インスタンスのみを使用するという点で上記の質問とは異なりQLineEditます。コードは次のとおりです。

import sys
from PySide import QtCore, QtGui

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        self.lineEdit = QtGui.QLineEdit(Dialog)
        self.lineEdit.setObjectName("lineEdit")
        QtCore.QObject.connect(self.lineEdit, QtCore.SIGNAL("textChanged(QString)"), Dialog.on_lineEdit_changed)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

class MainWindow(QtGui.QMainWindow, Ui_Dialog):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        Ui_Dialog.__init__(self)
        Ui_Dialog.setupUi(self, self)
    @QtCore.Slot(unicode) # signal with no arguments
    def on_lineEdit_changed(self, text):
        print 'Changed to', text

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())

Ui_Dialogクラスのコードはpysideuic、Qt Designer の .ui ファイルから生成されますが、問題をわかりやすくするために少し短くしています。

4

2 に答える 2