• 5437阅读
  • 9回复

请问这小段程序有什么问题???(已解决) [复制链接]

上一主题 下一主题
离线xcykkk
 
只看楼主 倒序阅读 楼主  发表于: 2009-03-25
#include <QtGui>
#include <QLabel>
#include <QPushButton>
#include <QApplication>

class Asdf : public QObject
{
    Q_OBJECT
public:
    QLabel *label;
    Asdf();
    ~Asdf();
public slots:
    void Open_Label();
};

Asdf::Asdf()
{
    label = new QLabel("Hello !");
}
Asdf::~Asdf()
{
    delete label;
}
void Asdf::Open_Label()
{
    label->show();
}

int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
    QPushButton *pushButton = new QPushButton("Open");
    Asdf *asdf = new Asdf();
    Asdf::connect(pushButton,SIGNAL(clicked()),asdf,SLOT(Open_Label()));
    pushButton->show();
    return app.exec();
}
[ 此帖被xcykkk在2009-04-16 12:56重新编辑 ]
离线jinnsky

只看该作者 1楼 发表于: 2009-03-26
我测试了一上午,发现只有在分离编译下才能链接成功,原因暂时不清楚,希望有人能解答一下~
追求卓越 JinnSky
离线jinnsky

只看该作者 2楼 发表于: 2009-03-26
把方法实现放在类里面也可以:
class Asdf : public QObject
{
    Q_OBJECT
public:
    QLabel *label;
    Asdf() {label = new QLabel("Hello !");}
    ~Asdf() {delete label;}
    public slots:
        void Open_Label() {label->show();}
};

也就是说使用分离编译或者把方法放在类里面都可以~估计跟Q_OBJECT有关~
追求卓越 JinnSky
离线xcykkk
只看该作者 3楼 发表于: 2009-03-26
回 2楼(jinnsky) 的帖子
你用的是什么编译器?
离线jinnsky

只看该作者 4楼 发表于: 2009-03-26
VC++ 2008
追求卓越 JinnSky
离线xcykkk
只看该作者 5楼 发表于: 2009-03-26
回 4楼(jinnsky) 的帖子
哦······
我的是  vs2005
也试了你说的两种 办法,还是不行
错误提示:


main.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Asdf::metaObject(void)const " (?metaObject@Asdf@@UBEPBUQMetaObject@@XZ)
1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall Asdf::qt_metacast(char const *)" (?qt_metacast@Asdf@@UAEPAXPBD@Z)
1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall Asdf::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Asdf@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>C:\Documents and Settings\Administrator\桌面\n\Debug\n.exe : fatal error LNK1120: 3 个无法解析的外部命令



看看这个是怎么个情况
离线jinnsky

只看该作者 6楼 发表于: 2009-03-26
我又用VS2005和g++试了一下,分离编译可以,后面那个方法不行~
能否把你分离编译的每个文件的代码分开贴出来看看?
追求卓越 JinnSky
离线jinnsky

只看该作者 7楼 发表于: 2009-03-26
终于知道原因了,其实是个很简单的问题,就是Q_OBJECT不能出现在编译单元,也就是.cpp文件中~
楼主可以把你最开始代码里的Q_OBJECT去掉,应该就能通过编译链接成功,但是由于没有Q_OBJECT,slots都是普通的成员函数,就算用connect与某个signal相关联也不会产生效果~
搞了这么久,希望能解决你的问题,呵呵~
追求卓越 JinnSky
离线xcykkk
只看该作者 8楼 发表于: 2009-03-26
回 7楼(jinnsky) 的帖子
哈哈 ···
谢谢啦 ···

长见识了!!!
离线jinnsky

只看该作者 9楼 发表于: 2009-03-26
不客气,呵呵~
追求卓越 JinnSky
快速回复
限100 字节
 
上一个 下一个