2014-01-13 5 views
1

У меня есть такой код:Qt QObject :: connnect() функция не может быть подключен

class MyListView : public QListView 
{ 
public: 
    MyListView(); 
    ~MyListView(); 

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

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

А конструктор, как:

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); 

} 

Так что я хочу, чтобы подключить кнопки на функции слот, но когда я скомпилировать его, я получил сообщение об ошибке, как:

QObject::connect: No such slot QListView::insertData() 

Я думаю, что проблема исходит от подключения F unction, в котором «это» не является правильным указателем, любая помощь? Заранее спасибо.

ответ

2

Вам нужно добавить макрос Q_OBJECT в вашем MyListView

Из Qt документации API:

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.

Таким образом, это должно быть:

class MyListView : public QListView 
{ 
    Q_OBJECT 
public: 
    ... 
} 
+0

Похоже QListView отличается от QObject , поскольку, когда я добавляю «Q_OBJECT», как вы рекомендовали, я получил новую ошибку: «неопределенная ссылка на« vtable для MyListView ». – zhoudingjiang

+0

Похоже на несвязанную мне проблему, вы можете захотеть повторно обновить код – tinkertime

+0

У вас есть _run qmake_ после того, как вы добавили макрос Q_OBJECT? – Zlatomir

Смежные вопросы