2011-01-27 59 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)')) 

我试着定义QTableWidget的为tableWidgetself.tableWidget,但这并没有改变任何东西。

有谁知道是什么原因造成的?


下面是最终代码:

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

它使用在this SO question描述的新.connect()语法。再次感谢!

回答

2

.connect()呼叫仅设置用于将信号和槽的关系。您实际上无法将值传递给.connect()调用中的插槽。您可以创建自己的插槽并将其放入.connect()的调用中,然后在您自己的插槽实施调用self.tableWidget.insertColumn(2)中进行调用。

编辑: 只是为了clarify..although槽不能直接拿在调用.connect()值,它可以接收被用于信号定义的参数。

+0

什么是创建一个插槽的语法?是否与定义函数相同? – speedofmac 2011-01-27 17:41:44

2

将信号与插槽相关联时,您只需提供方法signture,而不应将参数传递给它。您提供的插槽方法的签名也应与信号的签名匹配。按照Qt的文档 的的签名引发的QAction的信号如下:(QT版本4.7.0)

void QAction::triggered (bool checked = false)

Essentialy需要将触发信号连接到一个期望有一个方法布尔参数。

你可以尝试有一段代码象下面这样:(未经测试)

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

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