【问题标题】:Why does SLOT('insertColumn()') fail in PyQt binding?为什么 SLOT('insertColumn()') 在 PyQt 绑定中失败?
【发布时间】:2011-01-27 17:27:25
【问题描述】:

我正在深入研究 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)

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

【问题讨论】:

    标签: python qt qt4 pyqt pyqt4


    【解决方案1】:

    .connect() 的调用只建立了信号和槽的关系。您实际上不能将值传递给 .connect() 调用中的插槽。您可以创建自己的插槽并将其放入对.connect() 的调用中,然后在您自己的插槽实现中调用self.tableWidget.insertColumn(2)

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

    【讨论】:

    • 创建槽的语法是什么?和定义函数一样吗?
    • 不幸的是我不知道python。这是相当标准的 python/Qt 用法,所以找到一个例子应该不会太难。 (或者有 python/Qt 经验的人会为你发布更完整的答案)
    • 只需在你的 python 类上定义一个方法并将其传递给 connect 而不是 Slot(...)
    • @speedofmac,有关详细信息,请参阅docs,但基本上您可以将任何可调用的 Python 传递给 connect() 而不是接收器/插槽对。
    • 感谢大家帮助我解决这个问题。我在问题中添加了最终代码。
    【解决方案2】:

    在将信号与插槽关联时,您只需提供方法签名,并且不应将参数传递给它。此外,您作为插槽提供的方法的签名应该与信号的签名匹配。根据 Qt 文档 QAction的triggered信号的签名如下:(Qt Version 4.7.0)

    void QAction::triggered ( bool checked = false )

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2014-08-12
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多