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_list
がQListWidget
) のときにスロットが呼び出されます。
ここに私の質問があります: なぜこの警告が表示されるのですか? 関係ないように見えるので、表示されないようにするにはどうすればよいですか?
編集:過去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 ファイルから生成されますが、問題をわかりやすくするために少し短くしています。