• 12451阅读
  • 2回复

为什么Q_OBJECT这么怪??大家来帮忙看下 [复制链接]

上一主题 下一主题
离线larryzhao
 

只看楼主 正序阅读 楼主  发表于: 2006-05-24
上次发帖之后我以为我已经摆脱了那个怪问题,结果今天继续做发现问题越来越怪了....

这是我的一个类:
class ProcessPanel : public QWidget
{
  Q_OBJECT

  public:
    ProcessPanel(QWidget *parent = 0, const char *name = 0);
    void addProcess(Process *aProcess);
  private:
    QLabel *theLabel;
    vector<Process*> vecProcesses;
};

声明了Q_OBJECT,非常正常...

下面是在同一个工程内的另一个类:
class MemBlock : public QPushButton
{
    Q_OBJECT
  public:
    MemBlock(struct MemPage *mp, QWidget* parent = 0, const char* name = 0);
    ~MemBlock(){};
    void showStatus();

  private:
    int theSize;
    int beginAD;
    int endAD;
    int processID;
    int theHeight;
    QColor *ptheColor;

 
};

构造函数的实现部分:
MemBlock::MemBlock(struct MemPage *mp, QWidget* parent, const char* name) : QPushButton(parent, name)
{
......
......
}

MemBlock这个类声明了Q_OBJECT后,编译就会指向构造函数的实现报错:
MemBlock.o: In function `MemBlock':/home/larry_zb/graphicshell/src/MemBlock.cpp:3: undefined reference to `vtable for MemBlock'
:/home/larry_zb/graphicshell/src/MemBlock.cpp:3: undefined reference to `vtable for MemBlock'
:/home/larry_zb/graphicshell/src/MemBlock.cpp:3: undefined reference to `vtable for MemBlock'
:/home/larry_zb/graphicshell/src/MemBlock.cpp:3: undefined reference to `vtable for MemBlock'

如果将构造函数这样写:
MemBlock::MemBlock(struct MemPage *mp, QWidget* parent, const char* name)
{
QPushButton(parent, name);
......
......
}
编译就不会报以上错误,而是指向构造函数的实现报另一个错,粘贴如下:
/home/larry_zb/graphicshell/src/MemBlock.cpp:3: 错误:对 ‘QPushButton::QPushButton()’ 的调用没有匹配的函数
/usr/lib/qt-3.3/include/qpushbutton.h:138: 附注:备选为: QPushButton::QPushButton(const QPushButton&)
/usr/lib/qt-3.3/include/qpushbutton.h:67: 附注: QPushButton::QPushButton(const QIconSet&, const QString&, QWidget*, const char*)
/usr/lib/qt-3.3/include/qpushbutton.h:65: 附注: QPushButton::QPushButton(const QString&, QWidget*, const char*)
/usr/lib/qt-3.3/include/qpushbutton.h:64: 附注: QPushButton::QPushButton(QWidget*, const char*)

这个错误不声明Q_OBJECT也会报,这也是我实在搞不清楚的一个问题,
而上面的ProcessPanel的类声明了Q_OBJECT就一点错误也没有...我真是要崩溃了....

大家救救我把,帮我解答一下
谢谢了
离线soros
只看该作者 2楼 发表于: 2009-10-14
这个才是真因:http://www.cuteqt.com/blog/?p=116
离线larryzhao

只看该作者 1楼 发表于: 2006-05-24
恶......经过自己的观察与试验终于搞清楚了这个问题,写出来让各位新手借鉴一下:

Q_OBJECT是我们要做响应消息而必须声明的,他的功能类似于mfc中的BEGIN_MESSAGE_MAG, END_MESSAGE_MAP, 不过不同。

我来说下我的发现经过:我上面的类是继承自QScrollView的,由于打开该类的实现发现已经声明了Q_OBJECT,我想会不会我不需要再声明了,于是我去掉我的类中的声明再编译运行,当然错误没有了,消息框中出现了:
No such slot : QScrollView :: buttonhandler() (这个slot代码我没有在上面给出)。
看到这个我想到这个Q_OBJECT应该是在本类中作消息响应的映射的功用的。所以我觉得应该是我的顺序问题,我的类里面已经声明并且实现了很多函数之后我才声明的Q_OBJECT,是不是因为这样它无法来生成这个映射表呢。于是为了验证我的想法,我把类里所有的函数的声明和实现全部注销,只留下Q_OBJECT,然后automake, 编译,通过。然后在去掉注销,automake, 编译,通过。至此证明了我的观点。(我不知道不automake直接编译行不行,急着发帖还没有试验)

坛子里面的大大们对我的问题一头雾水我觉得可能是因为各位都是自己写makefile, 然后make,所以可能完全碰不到这个问题,而我用的环境是KDevelop KDE/C++,所以才会有这样的问题。
希望新手不要再像我一样再这个问题上浪费这么多时间.....


PS: 不过主贴中的另一个问题就是在成员初始化表中调用QPushButton的构造函数,和在构造函数体内调用一个正确一个错误的问题还么有搞懂....希望大家继续帮我....
快速回复
限100 字节
 
上一个 下一个