• 8142阅读
  • 9回复

[提问]一个简单的QT对话框不能编译成功,怎么回事呢?附代码求解~ [复制链接]

上一主题 下一主题
离线xiang8000
 

只看楼主 倒序阅读 楼主  发表于: 2011-01-10
就一个mian.cpp文件,一个对话框一个按钮一个消息框
#include <QApplication>
#include <QDialog>
#include <QMessageBox>
#include <QPushButton>
#include <QGridLayout>
class a:public QDialog
{
    Q_OBJECT  
//如果这里将它注释掉就可以正常显示窗体界面,因为后来又加上了消息槽,人家说重新建文件然后把这个代码粘贴过去重新编译就可以了,我用其它代码试过,确实行~但在这个代码里却行不通了,不知道是这个的问题还是其它什么地方有语法错误,求大侠帮忙看看。求解
public:
    a()
    {
        p=new QPushButton;
        l=new QGridLayout(this);
        p->setText("AnNiu");
        l->addWidget(p,0,0);
        connect(p,SIGNAL(clicked()),this,SLOT(dianji()));
    }
public:
    QGridLayout *l;
    QPushButton *p;
private slots:
    void dianji();
};
void a::dianji()
{
    QMessageBox::about(0,"biaoti","neirong");
}
int main(int argc,char *argv[])
{
        QApplication app(argc,argv);
        a d;
        d.show();
        return app.exec();
}

*************************************这是我把上面那段做了点点修改*******************************#include <QApplication>
#include <QDialog>
#include <QMessageBox>
#include <QPushButton>
#include <QGridLayout>
class a:public QDialog
{
    Q_OBJECT
public:
    a()
    {
        p=new QPushButton;
        l=new QGridLayout(this);
        p->setText("AnNiu");
        l->addWidget(p,0,0);
    }
public:
    QGridLayout *l;
    QPushButton *p;
private slots:
    void dianji();
};
void a::dianji()
{
    QMessageBox::about(0,"biaoti","neirong");
}
int main(int argc,char *argv[])
{
        QApplication app(argc,argv);
        a d;
        d.connect(d.p,SIGNAL(clicked()),d,SLOT(dianji()));  //考虑是不是需要实例来执行connect这个函数,所以将它移到这里,结果还是提示错误,但是错误提示变化了点,还是不能编译,纠结了,麻烦各位叔叔阿姨大姐大哥小弟小妹了~~~在此跪谢~~
        d.show();
        return app.exec();
}

离线XChinux

只看该作者 1楼 发表于: 2011-01-10
将你的类的定义(.h)和实现(.cpp)分开吧。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线xiang8000

只看该作者 2楼 发表于: 2011-01-10
我就是把它合在一起的,我在学QT嘛,想把代码整合一下简单明了也容易做记录些,分开来写的代码没问题,运行一切正常,但是合到一起就来问题了,结构都一样的,都是在构造函数中做这些事情,为什么就执行不了了呢?心里成疙瘩了……还望大家鞭策我一番,谢谢
离线XChinux

只看该作者 3楼 发表于: 2011-01-10
因为有了Q_OBJECT后,moc编译器要生成对应的moc_xxxx.h和moc_xxxx.cpp文件的。
就是因为这个产生的问题。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线xiang8000

只看该作者 4楼 发表于: 2011-01-10
那我应该怎么弄才能让他编译通过呢?或者麻烦斑竹帮我改下……谢谢了,急
离线xiang8000

只看该作者 5楼 发表于: 2011-01-10
回 3楼(XChinux) 的帖子
哦,总斑竹的意思是,要用Q_OBJECT的话就必须把这个分开为XXX.H和XXX.cpp两个文件,这样才能让MOC通过,是这个意思么?斑竹大人
离线dbzhang800

只看该作者 6楼 发表于: 2011-01-11
Re:回 3楼(XChinux) 的帖子
引用第5楼xiang8000于2011-01-10 23:14发表的 回 3楼(XChinux) 的帖子 :
哦,总斑竹的意思是,要用Q_OBJECT的话就必须把这个分开为XXX.H和XXX.cpp两个文件,这样才能让MOC通过,是这个意思么?斑竹大人

不是说必须分开,但如果你是初学,强烈建议你分开。

或许,你可以大致看一下这个
http://hi.baidu.com/cyclone/blog/item/b8bea1442d6b918fb2b7dcb4.html

离线biggerdog
只看该作者 7楼 发表于: 2011-01-11
main.cpp:

#include <QApplication>

#include "a.h"

int main(int argc,char *argv[])
{
        QApplication app(argc,argv);
        
        a d;
        d.show();
        
        return app.exec();
}

a.h:

#include <QDialog>
#include <QPushButton>
#include <QGridLayout>

class a:public QDialog
{
    Q_OBJECT
public:
    a();
public:
    QGridLayout *l;
    QPushButton *p;
private slots:
    void dianji();
};

a.cpp:

#include <QMessageBox>
#include "a.h"

a::a()
{
       p = new QPushButton(0);
       p->setText("AnNiu");
       connect(p,SIGNAL(clicked()),this,SLOT(dianji()));  

       l = new QGridLayout(this);
       l->addWidget(p,0,0);
}

void a::dianji()
{
    QMessageBox::about(0,"biaoti","neirong");
}
[ 此帖被biggerdog在2011-01-11 11:28重新编辑 ]
离线zhouyiliang
只看该作者 8楼 发表于: 2011-01-11
回 7楼(biggerdog) 的帖子
在末尾加一句#include "main.moc" 试试
离线biggerdog
只看该作者 9楼 发表于: 2011-01-11
回 8楼(zhouyiliang) 的帖子
不用加 我是把成功的代码贴给他的
快速回复
限100 字节
 
上一个 下一个