为什么SLOT('insertColumn()')在PyQt绑定中失败?

时间:2011-01-27 17:27:26

标签: python qt qt4 pyqt pyqt4

我正在深入PyQt,我遇到了一点烦恼。 SLOT('insertColumn()')在附加到GUI中的按钮时不执行任何操作。 SLOT('clear()')工作正常, insertColumn()在绑定之外工作。 insertColumn()在Qt文档中列为公共插槽,因此我被卡住了。

以下是代码:

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定义为 tableWidget self.tableWidget ,但这并没有改变任何内容。

有人知道造成这种情况的原因吗?


这是最终的代码:

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

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

2 个答案:

答案 0 :(得分:2)

.connect()的调用仅设置信号和插槽的关系。您实际上无法将值传递到.connect()调用中的插槽。您可以创建自己的广告位并将其置于.connect()的通话中,然后在您自己的广告位实施电话self.tableWidget.insertColumn(2)中。

编辑:   只是为了澄清......尽管插槽不能直接在.connect()的调用中取值,但它可以接收为信号定义的参数。

答案 1 :(得分:2)

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

void QAction::triggered ( bool checked = false )

实际上,您需要将触发信号连接到需要布尔参数的方法。

您可以尝试使用如下代码段:(未经测试)

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

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

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