Q:

Qt QObject::connect() function cannot be connected

I have the code like this:
class MyListView : public QListView
{
public:
    MyListView();
    ~MyListView();

public slots:
    void insertData();
    void deleteData();
    void showData();

private:
    QStringListModel *model;
    QListView *listView;
};

And the constructor is like:
MyListView :: MyListView()
{
    QStringList data;
    data << "Letter A" << "Letter B" << "Letter C";
    model = new QStringListModel;
    model->setStringList(data);

    listView = new QListView;
    listView->setModel(model);

    /* the three buttons */
    QPushButton *insertBtn = new QPushButton(QObject::tr("insert"),this);
    QObject::connect(insertBtn,SIGNAL(clicked()),this,SLOT(insertData()));
    QPushButton *deleteBtn = new QPushButton(QObject::tr("delete"),this);
    QObject::connect(deleteBtn,SIGNAL(clicked()),this,SLOT(deleteData()));
    QPushButton *showBtn = new QPushButton(QObject::tr("show"),this);
    QObject::connect(showBtn,SIGNAL(clicked()),this,SLOT(showData()));

    /* layout */
    QHBoxLayout *btnLayout = new QHBoxLayout;
    btnLayout->addWidget(insertBtn);
    btnLayout->addWidget(deleteBtn);
    btnLayout->addWidget(showBtn);
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(listView);
    mainLayout->addLayout(btnLayout);
    setLayout(mainLayout);

}

So I want to connect the push button to the slot functions, but when I compile it, I got the error message as: 
QObject::connect: No such slot QListView::insertData()

I think the problem comes from the connect function, in which, "this" is not the right pointer, any help? Thanks in advance.

A:

You need to add the Q_OBJECT macro in your MyListView
From Qt API docs:

Notice that the Q_OBJECT macro is mandatory for any object that
  implements signals, slots or properties. You also need to run the Meta
  Object Compiler on the source file. We strongly recommend the use of
  this macro in all subclasses of QObject regardless of whether or not
  they actually use signals, slots and properties, since failure to do
  so may lead certain functions to exhibit strange behavior.

So, it should be:
class MyListView : public QListView
{
    Q_OBJECT
public:
    ...
}

