Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] QSignalMapper вызывает слот много раз


Автор: spyswamp 21.12.2011, 19:07
У меня есть 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'ом?

Автор: spyswamp 22.12.2011, 09:34
Виновата невнимательность.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)