Chinaunix

标题: 请大家帮忙看看这段程序,感觉没有错误,可就是编不过去![qt] [打印本页]

作者: cyberHunK    时间: 2007-12-03 14:19
标题: 请大家帮忙看看这段程序,感觉没有错误,可就是编不过去![qt]
#include <qapplication.h>
#include <qwidget.h>
#include <qlistview.h>
#include <qmessagebox.h>

class MyMainWindow : public QWidget
{
    Q_OBJECT
public:
    MyMainWindow();
private:
    QListView *pListView;
   
    QListViewItem *pItem;
    QListViewItem *pTopic1;
    QListViewItem *pTopic2;
    QListViewItem *pTopic3;
   
    QMessageBox *pBox;
public slots:
    void ShowDescription();   
};

void MyMainWindow::ShowDescription()
{
    pBox = new QMessageBox("Book Info",
                           "Here, we could show some short information",
                           QMessageBox::Information,
                           QMessageBox::Ok,
                           0,
                           0);
   
    pBox->show();   
}

MyMainWindow::MyMainWindow()
{
    setGeometry(150, 150, 800, 600);
   
    pListView = new QListView(this);
    pListView->setGeometry(0, 0, 400, 400);
    pListView->setRootIsDecorated(true);
   
    pListView->addColumn("Book");
    pListView->addColumn("Sold Copies");
    pListView->addColumn("Price");
   
    pTopic1 = new QListViewItem(pListView, "Topic 1");
    pTopic2 = new QListViewItem(pListView, "Topic 2");
    pTopic3 = new QListViewItem(pListView, "Topic 3");
   
    pItem = new QListViewItem(pTopic1, "Book 1", "21000", "$29.99");
    pItem = new QListViewItem(pTopic1, "Book 2", "21000", "$29.99");
    pItem = new QListViewItem(pTopic1, "Book 3", "21000", "$29.99");
    pItem = new QListViewItem(pTopic2, "Book 4", "22000", "$39.99");
    pItem = new QListViewItem(pTopic2, "Book 5", "22000", "$39.99");
    pItem = new QListViewItem(pTopic2, "Book 6", "22000", "$39.99");
    pItem = new QListViewItem(pTopic3, "Book 7", "23000", "$49.99");
    pItem = new QListViewItem(pTopic3, "Book 8", "23000", "$49.99");
    pItem = new QListViewItem(pTopic3, "Book 9", "24000", "$49.99");   
   
    connect(pListView, SIGNAL(doubleClicked(QListViewItem *)), this, SLOT(ShowDescription()));
}

int main(int argc, char **argv)
{
    QApplication a(argc, argv);
    MyMainWindow w;
    a.setMainWidget(&w);
    w.show();
    return a.exec();
}

上面是完整的程序,我只是按着书本上的例子,做了一个响应双击事件的槽函数而已!编译的时候居然报构造函数的错误?不解!注释掉Q_OBJECT宏程序通过,当然这样的话槽函数也办法了激活了!大家给看看,是什么地方出的错?谢谢
作者: cyberHunK    时间: 2007-12-03 15:06
很简单的一个例子,问题应该就出在槽函数身上,可我在帮助文档上查找比较没发现什么纰漏。请大家帮帮忙了!
作者: moyihua    时间: 2007-12-03 23:51
是link问题把?
要把用到的所有文件名加入 .pro文件中,再编译一次,看看
作者: cyberHunK    时间: 2007-12-04 09:08
应该不是工程的问题,我一般使用qmake -project自动生成.pro
作者: 萎代码    时间: 2007-12-11 10:27
把下面部分 放到一个单独的头文件里面,qt的moc时候要这个头文件的,qt的moc机制决定的
#include <qapplication.h>
#include <qwidget.h>
#include <qlistview.h>
#include <qmessagebox.h>

class MyMainWindow : public QWidget
{
    Q_OBJECT
public:
    MyMainWindow();
private:
    QListView *pListView;
   
    QListViewItem *pItem;
    QListViewItem *pTopic1;
    QListViewItem *pTopic2;
    QListViewItem *pTopic3;
   
    QMessageBox *pBox;
public slots:
    void ShowDescription();   
};
作者: cyberHunK    时间: 2007-12-19 10:48
楼上的兄弟,编译连接通过,真的是这样啊!qt的这种机制还真的挺让人费解啊!这里还有个问题需要询问,什么条件下才这样使用moc机制?以前在一个cpp里,也这样直接定义过,当时可以通过啊!不解,请指教!
作者: cyberHunK    时间: 2007-12-21 10:52
这个槽又出什么问题了?我要单击一个按钮打开字体对话框QFontDialog,感觉没什么问题啊?还要请大家帮忙看看!

建立一个Use_FontDialog.h头文件,如下:
#include <qapplication.h>
#include <qwidget.h>
#include <qfontdialog.h>
#include <qfont.h>
#include <qpushbutton.h>

class MyMainWindow : public QWidget
{
    Q_OBJECT
public:
    MyMainWindow();
private:
    QPushButton *pButton;
    QFontDialog *pFDialog;
    QFont MyFont;
public slots:
    void CallFontDialog();
};



建立一个Use_FontDialog.cpp文件,程序如下:
#include "Use_FontDialog.h"

MyMainWindow::MyMainWindow()
{
    setGeometry(100, 100, 640, 480);
    pButton = new QPushButton("Open FontDialog", this);
    pButton->setGeometry(500, 400, 100, 60);
    connect(pButton, SIGNAL(clicked()), this, SLOT(CallFontDialog()));
}
void MyMainWindow::CallFontDialog()
{
    bool ok;
    MyFont = pFDialog->getFont(&ok);
}
int main(int argc, char **argv)
{
    QApplication a(argc, argv);
    MyMainWindow w;
    a.setMainWidget(&w);
    w.show();
    return a.exec();
}

先前一位兄弟说qt的moc机制需要单独的头文件,第一个问题已经这样做给解决掉了!现在我也是这样实现的,可为什么又报构造函数的错误,哪里出的问题啊?

[ 本帖最后由 cyberHunK 于 2007-12-21 10:55 编辑 ]
作者: 萎代码    时间: 2007-12-26 14:41
pFDialog 什么时候new了??qt是基于c++的图形库,建议你准备点c++的基础。
作者: xuanyuzheng    时间: 2007-12-26 16:29
他用的那个函数是静态函数,不需要对象。
作者: 萎代码    时间: 2007-12-27 15:36
那应该QFontDialog::getFont(&ok)的说吧
作者: xuanyuzheng    时间: 2007-12-27 18:18
应该是那样,但是他那样写liunx不会报错,所以错误不在这里。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2