PDA

View Full Version : Segfault when using signal and slot in dynamic library



e.t.
28th October 2015, 18:19
Hello,

I have two part in my program :
- the first is like a "plugin manager" with a gui
- the second is one (or more) "plugin" also with a gui

all work well (when i get from the dyanmic library the layout and display it), but when i click on the button it's segfault.

there is the backtrace with gdb

#0 0x00007ffff6512224 in QMetaObject::activate(QObject*, int, int, void**) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#1 0x00007ffff7114e42 in QAbstractButton::clicked(bool) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#2 0x00007ffff6e9e096 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#3 0x00007ffff6e9ebae in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#4 0x00007ffff6e9ed24 in QAbstractButton::mouseReleaseEvent(QMouseEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#5 0x00007ffff6de2ea5 in QWidget::event(QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#6 0x00007ffff6da7c8c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#7 0x00007ffff6dadb61 in QApplication::notify(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#8 0x00007ffff64eac2d in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#9 0x00007ffff6dab9e1 in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) ()
from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#10 0x00007ffff6dffbbf in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#11 0x00007ffff6e019bb in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#12 0x00007ffff6da7c8c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#13 0x00007ffff6dace56 in QApplication::notify(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#14 0x00007ffff64eac2d in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#15 0x00007ffff4f1425c in QGuiApplicationPrivate::processMouseEvent(QWindowS ystemInterfacePrivate::MouseEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#16 0x00007ffff4f15925 in QGuiApplicationPrivate::processWindowSystemEvent(Q WindowSystemInterfacePrivate::WindowSystemEvent*) ()
from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#17 0x00007ffff4efe858 in QWindowSystemInterface::sendWindowSystemEvents(QFl ags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#18 0x00007fffeede85b0 in ?? () from /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so
#19 0x00007ffff4922e04 in g_main_context_dispatch () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#20 0x00007ffff4923048 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#21 0x00007ffff49230ec in g_main_context_iteration () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#22 0x00007ffff653798c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#23 0x00007ffff64e996b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#24 0x00007ffff64f00e1 in QCoreApplication::exec() () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#25 0x0000000000409264 in main (ac=1, av=0x7fffffffe598) at src/main.cpp:49

There is my class that is in the shared library
the ".h"


#ifndef TEXTVIEW_H_
# define TEXTVIEW_H_

# include <QPushButton>
# include "View.h"

class TextView : public QObject, public View
{
Q_OBJECT

public:
TextView(AController &controller, ITcpModel &model);
virtual ~TextView();

virtual int getX();
virtual int getY();
virtual int getRows();
virtual int getCols();

public slots:
void signtest(bool);
private:
QPushButton *_test;
};

#endif


the ".cpp"


# include "TextView.h"
# include <iostream>

TextView::TextView(AController &controller, ITcpModel &model):
View(controller, model)
{
_test = new QPushButton();
_test->setText("THIS IS A BUTTON !");
_layout->addWidget(_test, 0, 0, 1, 1);
std::cout << "CONNECT " <<
connect(_test, SIGNAL(clicked(bool)),
this, SLOT(signtest(bool))) << std::endl;
}

void TextView::signtest(bool)
{
std::cout << "print this please" << std::endl;
}

TextView::~TextView()
{}

int TextView::getX() {return 1;}
int TextView::getY() {return 1;}
int TextView::getRows() {return 1;}
int TextView::getCols() {return 1;}



There is View


class View : public AView<QGridLayout>
{
public:
View(AController &controller, ITcpModel &model);
virtual ~View();

virtual QGridLayout &getLayout();
virtual void messageBox(const std::string &str);

virtual int getX() = 0;
virtual int getY() = 0;
virtual int getRows() = 0;
virtual int getCols() = 0;
protected:
QGridLayout *_layout;
};


Thank you for reading and sorry for my bad english