• 6609阅读
  • 5回复

很简单的一个问题劳驾各位帮帮忙~~~ [复制链接]

上一主题 下一主题
离线whisper215
 
只看楼主 倒序阅读 楼主  发表于: 2009-03-03
本人学习Qt 不到一周,之前几乎没有任何基础,所以经常在一些小问题上卡住很久,现在有碰到一个弱智问题,劳请大家帮帮忙啊~~~~

我用的是Qt Create 在Windows下入门,

自己的问法好像不对,大家似乎看到我的代码就烦了~~ 这么久都没人理…………

其实主要的问题就是 在ui_mainwindow.h中声明了两个类指针 QButton *btnClose 和 QWidget *centralWidget 但是在mainwindow.cpp中使用时却无法通过编译,centralWidget可以,但btnClose却出现错误,说是没有声明,而且在mainwindow.cpp中编写的时候,也无法检测到………………

拜托了………………

代码:
######################
main.cpp
######################
#include <QtGui/QApplication>
#include "mainwindow.h"

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


##################
mainwindow.cpp
##################
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindowClass)
{
    ui->setupUi(this);
    QObject::connect(btnClose, SIGNAL(click()), centralWidget, SLOT(quit()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

#######################
mainwindow.h
#######################
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>

namespace Ui
{
    class MainWindowClass;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindowClass *ui;
};

#endif // MAINWINDOW_H



######################
ui_mainwindow.h
######################
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QLabel>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QPushButton>
#include <QtGui/QStatusBar>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>

#include "ui_mainWindow.h"
QT_BEGIN_NAMESPACE

        class Ui_MainWindowClass
{
public:
    QWidget *centralWidget;
    QLabel *label;
    QPushButton *btnClose;
    QPushButton *btnChange;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *MainWindowClass)
    {
        if (MainWindowClass->objectName().isEmpty())
            MainWindowClass->setObjectName(QString::fromUtf8("MainWindowClass"));
        MainWindowClass->resize(421, 246);
        centralWidget = new QWidget(MainWindowClass);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        label = new QLabel(centralWidget);
        label->setObjectName(QString::fromUtf8("label"));
        label->setGeometry(QRect(30, 10, 361, 131));
        btnClose = new QPushButton(centralWidget);
        btnClose->setObjectName(QString::fromUtf8("btnClose"));
        btnClose->setGeometry(QRect(30, 160, 120, 23));
        …………
    …………      
};

namespace Ui {
    class MainWindowClass: public Ui_MainWindowClass {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H



错误的地方在mainwindow.cpp中
QObject::connect(btnClose, SIGNAL(click()), centralWidget, SLOT(quit()));
这里
error: `btnClose' was not declared in this scope
说是btnClose没有声明,但是在ui_mainwindow里面明明已经有声明了啊~~~~~

假如把mainwindow.h中
class MainWindow : public QMainWindow
改为
class MainWindow : public QMainWindow,public Ui_MainWindowClass
就会出现这种错误
error: expected class-name before '{' token

这总低级的错误在网上实在搜不到相同的案例,所以只能来这问了,各位勿笑~~~~~~~~~~~~~~~
[ 此帖被whisper215在2009-03-03 19:21重新编辑 ]
离线wd007

只看该作者 1楼 发表于: 2009-03-05
#include <QtGui/QMainWindow>

//你问什么要在mainwindow.h里面开头加上下马这个呢
namespace Ui
{
    class MainWindowClass;
}
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
只看该作者 2楼 发表于: 2009-03-06
要么
ui->setupUi(this);换setupUi(this);

要么下面写
connect(ui->btnClose, SIGNAL(click()), ui->centralWidget, SLOT(quit()));
离线foxyz

只看该作者 3楼 发表于: 2009-03-06
首先,你的ui_xxx.h(qt自动产生的)已经有
namespace Ui {
    class MainWindowClass: public Ui_MainWindowClass {};
} // namespace Ui
了,所以请你去掉mainwindow.h中的
namespace Ui
{
    class MainWindowClass;
}

其次:
在你自己的mainwindow.h中
private:
    Ui::MainWindowClass *ui;
改成
private:
    Ui::MainWindowClass ui;
你定义个指针,就得new出来。一般的用法是直接生成对象。

因为你使用的是组合方式。
如果你使用多继承:
class MainWindow : public QMainWindow, public Ui::MainWindowClass  
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

//private:
//Ui::MainWindowClass    ui;  这个不需要了
};
同时在构造函数中调用setupUi(this);

相反在组合方式中,你得在构造函数中这么调用:ui.setupUi(this)
离线wd007

只看该作者 4楼 发表于: 2009-03-08
呵呵,楼上说的已经很全面了,就是这样的
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线whisper215
只看该作者 5楼 发表于: 2009-03-09
真的是太感谢各位了,问题按照你们提供的方法已经解决了,哈哈哈哈哈
快速回复
限100 字节
 
上一个 下一个