QSignalMapper дает мне ошибку сегментации

Я хочу написать метод, который создает кнопку и подключает ее к слоту, который принимает строку:

void Widget::createButton(const char *member)
{
QPushButton *button = new QPushButton(this);
QSignalMapper *signalMapper = new QSignalMapper(this);
signalMapper->setMapping(button, "Test");

connect(signalMapper, SIGNAL(mapped(QString)), this, member);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
}

void Widget::sendCom(QString data)
{
std::cout << data << std::endl;
}

на примере Widget (просто подкласс QWidget) я делаю:

widget->createButton(SLOT(sendCom(QString))

без отображения он работал нормально, и я скопировал синтаксис отображения из аналогичного фрагмента кода, который также работает отлично. Компилируется без ошибок, но когда я нажимаю кнопку, я получаю ошибку сегментации. Есть идеи?

Редактировать: как peppe предложил я запустил valgrind и вот вывод

==31303== Invalid read of size 8
==31303==    at 0x3E1632DBF0: QAbstractButton::text() const (in /usr/lib64/libQtGui.so.4.6.2)
==31303==    by 0x407A66: Widget::sendCom(QString) (widget.cpp:36)
==31303==    by 0x40804E: Widget::qt_metacall(QMetaObject::Call, int, void**) (moc_widget.cpp:72)
==31303==    by 0x3E0FB6A7DE: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib64/libQtCore.so.4.6.2)
==31303==    by 0x3E0FB6DEE4: QSignalMapper::mapped(QString const&) (in /usr/lib64/libQtCore.so.4.6.2)
==31303==    by 0x3E0FB6E009: QSignalMapper::map(QObject*) (in /usr/lib64/libQtCore.so.4.6.2)
==31303==    by 0x3E0FB6F23F: QSignalMapper::qt_metacall(QMetaObject::Call, int, void**) (in /usr/lib64/libQtCore.so.4.6.2)
==31303==    by 0x3E0FB6A7DE: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib64/libQtCore.so.4.6.2)
==31303==    by 0x3E165DCE51: QAbstractButton::clicked(bool) (in /usr/lib64/libQtGui.so.4.6.2)
==31303==    by 0x3E1632E75A: ??? (in /usr/lib64/libQtGui.so.4.6.2)
==31303==    by 0x3E1632FADA: ??? (in /usr/lib64/libQtGui.so.4.6.2)
==31303==    by 0x3E1632FD4B: QAbstractButton::mouseReleaseEvent(QMouseEvent*) (in /usr/lib64/libQtGui.so.4.6.2)
==31303==  Address 0x8 is not stack'd, malloc'd or (recently) free'd
==31303==
==31303==
==31303== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==31303==  Access not within mapped region at address 0x8
==31303==    at 0x3E1632DBF0: QAbstractButton::text() const (in /usr/lib64/libQtGui.so.4.6.2)
==31303==    by 0x407A66: Widget::sendCom(QString) (widget.cpp:36)
==31303==    by 0x40804E: Widget::qt_metacall(QMetaObject::Call, int, void**) (moc_widget.cpp:72)
==31303==    by 0x3E0FB6A7DE: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib64/libQtCore.so.4.6.2)
==31303==    by 0x3E0FB6DEE4: QSignalMapper::mapped(QString const&) (in /usr/lib64/libQtCore.so.4.6.2)
==31303==    by 0x3E0FB6E009: QSignalMapper::map(QObject*) (in /usr/lib64/libQtCore.so.4.6.2)
==31303==    by 0x3E0FB6F23F: QSignalMapper::qt_metacall(QMetaObject::Call, int, void**) (in /usr/lib64/libQtCore.so.4.6.2)
==31303==    by 0x3E0FB6A7DE: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib64/libQtCore.so.4.6.2)
==31303==    by 0x3E165DCE51: QAbstractButton::clicked(bool) (in /usr/lib64/libQtGui.so.4.6.2)
==31303==    by 0x3E1632E75A: ??? (in /usr/lib64/libQtGui.so.4.6.2)
==31303==    by 0x3E1632FADA: ??? (in /usr/lib64/libQtGui.so.4.6.2)
==31303==    by 0x3E1632FD4B: QAbstractButton::mouseReleaseEvent(QMouseEvent*) (in /usr/lib64/libQtGui.so.4.6.2)

Это помогает найти адрес, но все же я не знаю, как отлаживать.

РЕДАКТИРОВАТЬ: проблема решена. Я сократил код, чтобы быть более точным, но это скрыло истинную причину

Create Button actually looked like this:

void Widget::createButton(const QString &text, int x, int y, const char *member, QString &data)
{
QPushButton *button = new QPushButton(this);
signalMapper = new QSignalMapper(this);
signalMapper->setMapping(button, data);
connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(sendCom(QString)));
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
button->setText(text);
button->move(x, y);
button->show();
}void Widget::sendCom(QString data)
{
QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());
std::cout << qPrintable(data) << std::endl;
std::cout << qPrintable(clickedButton->text()) << std::endl;
}

Qobject_cast вызвал SIGSEGV. Это еще предстоит уточнить, почему это так.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]