QT在VS2008上跑的不是很顺利。。。在用户自定义槽之后,connect无法顺利连接自定义的槽与信号,可能会有如下报错:
1>MyWidgetEx.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall MyWidgetEx::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyWidgetEx@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 1>MyWidgetEx.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall MyWidgetEx::qt_metacast(char const *)" (?qt_metacast@MyWidgetEx@@UAEPAXPBD@Z) 1>MyWidgetEx.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall MyWidgetEx::metaObject(void)const " (?metaObject@MyWidgetEx@@UBEPBUQMetaObject@@XZ)
而解决方案就是将使用到自定义槽的类的定义与函数分别写在一个.h和一个.cpp文件里,例如:
// MyWidgetEx.h
#pragma once #include <QtGui/QWidget> #include <QtGui/QPushButton> class MyWidgetEx : public QWidget { Q_OBJECT public: MyWidgetEx(void); ~MyWidgetEx(void); private: QPushButton *btn; public slots: void setButtonText(); };
// MyWidgetEx.cpp #pragma once #include "MyWidgetEx.h" MyWidgetEx::MyWidgetEx(void) { this->setGeometry(100,100,300,300); btn=new QPushButton("Start",this); btn->setGeometry(10,10,100,40); connect(btn,SIGNAL(clicked()),this,SLOT(setButtonText())); } MyWidgetEx::~MyWidgetEx(void) { } void MyWidgetEx::setButtonText() { btn->setText("Change"); }
然后手动编译MyWidget.h,命令类似于:moc MyWidget.h -o MyWidget.moc
再将主程序修改。。。
// Main.cpp #include <iostream> #include <QtGui/QApplication> #include <QtGui/QPushButton> #include "MyWidgetEx.moc" #pragma comment(lib,"QtCore4.lib") #pragma comment(lib,"QtGui4.lib") using namespace std; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidgetEx w; w.show(); return app.exec(); }
代码就可以顺利执行了。
如果觉得这样麻烦的话,也可以在VS里做如下修改
这样就可以直接编译程序了。