Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么插槽(';insertColumn()';)在PyQt绑定中失败?_Python_Qt_Qt4_Pyqt_Pyqt4 - Fatal编程技术网

Python 为什么插槽(';insertColumn()';)在PyQt绑定中失败?

Python 为什么插槽(';insertColumn()';)在PyQt绑定中失败?,python,qt,qt4,pyqt,pyqt4,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)

我正在潜入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定义为tableWidgetself.tableWidget,但这并没有改变任何事情

有人知道这是什么原因吗


以下是最终代码:

def add_column(self):
    tableWidget.insertColumn(1)
self.MenuAddColumn.triggered.connect(add_column)
它使用新的.connect()语法,如中所述。再次感谢

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

编辑:
只是澄清一下。虽然插槽不能在调用
.connect()
时直接获取值,但它可以接收为信号定义的参数。

将信号与插槽关联时,您只需提供方法符号,而不应向其传递参数。另外,作为插槽提供的方法的签名应该与信号的签名匹配。根据Qt文件 QAction触发信号的特征如下:(Qt版本4.7.0)


无效QAction::已触发(bool checked=false)

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

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


self.connect(self.menuadd列,信号('triggered(bool)),
自我,插槽('colAddition(bool)')


创建插槽的语法是什么?与定义函数相同吗?不幸的是,我不懂python。这是非常标准的python/Qt用法,因此不难找到一个示例。(或者有python/Qt经验的人会为您提供更完整的答案)只需在python类上定义一个方法,并将其传递给connect而不是Slot(…)@speedofmac,有关详细信息,请参阅,但基本上您可以传递任何python callable to connect(),而不是receiver/Slot对。感谢大家帮我解决这个问题。我为问题添加了最后一段代码。
def colAddition(self,value):  
    if value:  
        self.tableWidget.insertColumn(2)