У меня есть QTableWidget с кнопками в определенной колонке. Кнопок столько же, сколько и строк в таблице. Решил попробовать тру-Qt-вэй. Создаю в делегате QSignalMapper, цепляю к нему клики по кнопкам вот так:
| Код | QWidget* ShortcutItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem&, const QModelIndex &index) const { QPushButton *button = new QPushButton(parent); //.... создание кнопки ....
connect(button, SIGNAL(clicked()), m_signalMapper, SLOT(map())); m_signalMapper->setMapping(button, index.row()); connect(m_signalMapper, SIGNAL(mapped(int)), this, SLOT(bla(int)));
return button; }
|
Предположим, у нас 4 строки. Далее кликаю по любой кнопке, например, в строке с индексом 3. Все бы ничего, но сло bla(int) вызовется столько раз, сколько кнопок было замаплено в QSignalMapper. И каждый вызов слот будет получать параметр равный 3. В чем проблема? Почему слот вызывается не 1 раз? Естественно QPushButton* каждый раз разный и setMapping() вызывается 4 раза (для 4 строк).
До этого я в тупую использовал QObject::sender() вот так:
| Код | QWidget* ShortcutItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem&, const QModelIndex &index) const { QPushButton *button = new QPushButton(parent); // .... .... button->setAccessibleName(QString("%1").arg(index.row())); connect(button, SIGNAL(clicked()), this, SLOT(emitClicked())); return button; }
|
И сам слот:
| Код | void ShortcutItemDelegate::emitClicked() { QPushButton *button = qobject_cast<QPushButton*>(sender()); if (!button) return; emit clicked(button->accessibleName().toInt()); }
|
Слот emitClicked() вызывался всего 1 раз. Но QObject::sender() как-то не кайф использовать, да и в доке про это тоже в warning'е сказано. Кто знает, что творится с QSignalMapper'ом? |