2011-01-27 7 views
2

私はPyQtに潜入しています。私はちょっと気になっています。 SLOT( 'insertColumn()')は、GUIのボタンに接続しても何もしません。 SLOT( 'clear()')は完全に動作し、insertColumn()はバインディングの外で動作します。 insertColumn()はQtのドキュメントにパブリックスロットとして記載されています。ここでなぜSLOT( 'insertColumn()')がPyQtバインディングで失敗するのですか?

コードです:

class MainWindow(QMainWindow): 
    def __init__(self, *args): 
     QMainWindow.__init__(self, *args) 

     # Table 
     self.tableWidget = QTableWidget(6, columnCount, self); 
     x = 0 
     for x in range(0, columnCount): 
      self.tableWidget.setColumnWidth(x, 30) 
     for x in range(0, 6): 
      self.tableWidget.setRowHeight(x, 24) 

     # Window geometery and layout 
     self.resize(800, 600) 
     self.setWindowTitle('PyTab') 
     self.setCentralWidget(self.tableWidget) 

     # Menu and toolbar actions 
     self.MenuExit = QAction(QIcon('exit.png'), 'Exit', self) 
     self.MenuExit.setShortcut('Ctrl+Q') 
     self.connect(self.MenuExit, SIGNAL('triggered()'), SLOT('close()')) 

     self.MenuAddColumn = QAction(QIcon('clear.png'), 'Add Column', self) 
     self.MenuAddColumn.setShortcut('Ctrl+N') 

     #This line works: 
     self.tableWidget.insertColumn(2) 

     # I'm not sure why this line isn't working: 
     self.connect(self.MenuAddColumn, SIGNAL('triggered()'), self.tableWidget, SLOT('insertColumn(2)')) 

私はtableWidgetself.tableWidgetとしてQTableWidgetを定義しようとしたが、それは何も変更しませんでした。

これを引き起こしていることは誰でも知っていますか? this SO questionで説明したようにそれは新しい.connect()構文を使用しています

def add_column(self): 
    tableWidget.insertColumn(1) 
self.MenuAddColumn.triggered.connect(add_column) 


はここで最終的なコードです。再度、感謝します!

答えて

2

.connect()を呼び出すと、信号とスロットの関係が設定されます。 .connect()コールでは、実際に値をスロットに渡すことはできません。独自のスロットを作成して.connect()へのコールに入れてから、自分のスロット実装のself.tableWidget.insertColumn(2)にコールすることができます。

編集: .connect()への呼び出しでスロットが直接値を取ることはできませんが、信号に対して定義されたパラメータを受け取ることができます。

+0

スロットを作成するための構文は何ですか?それは関数を定義するのと同じですか? – speedofmac

+0

残念ながら私はpythonを知らない。それは非常に標準的なpython/Qtの使用ですが、例を見つけるのはあまり難しくありません。 –

+0

Pythonクラスのメソッドを定義し、Slot(...)の代わりに接続するように渡します。 –

2

シグナルをスロットに関連付ける場合、メソッドsigntureだけを提供する必要があり、引数を渡すべきではありません。また、スロットとして提供するメソッドのシグネチャは、シグナルのシグネチャと一致する必要があります。あなたが期待するメソッドにトリガ信号を接続する必要があります(Qtのバージョン4.7.0)

void QAction::triggered (bool checked = false)

Essentialy:Qtのドキュメントごとに の署名はQActionの信号は以下の通りであるトリガブール値の引数。

あなたは、以下のようなコードスニペットを持つ試すことができます(未テスト)

self.connect(self.MenuAddColumn, SIGNAL('triggered(bool)'),
self, SLOT('colAddition(bool)')

def colAddition(self,value): 
    if value: 
     self.tableWidget.insertColumn(2) 

関連する問題