Почему SLOT ('insertColumn ()') не работает в привязке PyQt? - PullRequest
2 голосов
/ 27 января 2011

Я погружаюсь в PyQt, и я столкнулся с небольшим раздражением. SLOT ('insertColumn ()') ничего не делает при подключении к кнопке в графическом интерфейсе. 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)

Он использует новый синтаксис .connect (), как описано в в этом вопросе SO .Еще раз спасибо!

Ответы [ 2 ]

2 голосов
/ 27 января 2011

При связывании сигнала со слотом вам необходимо предоставить только сигнатуру метода, и вы не должны передавать ей аргументы. Также сигнатура метода, который вы предоставляете в качестве слота, должна соответствовать сигнатуре сигнала. Согласно документам Qt сигнатура запущенного сигнала QAction выглядит следующим образом: (Qt Version 4.7.0)

void QAction::triggered ( bool checked = false )

По сути, вам нужно подключить сработавший сигнал к методу, который ожидает логический аргумент.

Вы можете попробовать фрагмент кода, как показано ниже: (не проверено)

self.connect(self.MenuAddColumn, SIGNAL('triggered(bool)'),<br> self, SLOT('colAddition(bool)')</p> <pre><code>def colAddition(self,value): if value: self.tableWidget.insertColumn(2)

2 голосов
/ 27 января 2011

Вызов .connect() только устанавливает отношения для сигнала и слота. На самом деле вы не можете передавать значения в слот при вызове .connect(). Вы можете создать свой собственный слот и поместить его в вызов .connect(), а затем в свой вызов реализации собственного слота self.tableWidget.insertColumn(2).

Edit: Просто для пояснения ... хотя слот не может напрямую принимать значения при вызове .connect(), он может принимать параметры, определенные для сигнала.

...