QT入门 & QT Creator 使用

1.从Hello World开始
见很多新人问如何使用QT Creator 
感觉还是抽点时间出来,写一个QT Creator使用帮助吧 

首先下载,地址如下 
http://get.qt.nokia.com/qtsdk/qt-sdk-win-opensource-2009.05.exe 

安装很简单,直接默认,点下一步即可 

安装好之后,打开QT Creator 
新建工程 File => New File or Project.. 
选择Projects => Empty QT4 Project 
输入工程名, Name, 例如 Hello 
储存位置Creat in, 例如 D:\QT\Sample\ 

按下Next, 这里刚开始学习,只要默认即可,一路Next下去,最后Finish 

这时, QT Creator自动创建一个Hello.pro文件 

打开此Hello.pro文件 
写入 
TARGET = hello 
TEMPLATE = app 
SOURCES += main.cpp 

然后右键Hello工程名, 选择菜单 Add New 
选择 C++ => C++ Source File, 按下OK 
输入源文件名Name: main.cpp 

打开main.cpp, 写一个简单的Hello world程序吧 

#include <QApplication> 
#include <QLabel> 

int main(int argc,char *argv[]) 

    QApplication app(argc,argv); 
    QLabel *label=new QLabel("Hello world!"); 
    label->show(); 
    return app.exec(); 


按下菜单 Build => Run编译运行
---------------------------------------------------华丽的分割线----------------------------------------

2.debug和release
让我们打开文件夹D:\QT\Sample\ 看看吧 
除了工程文件hello.pro和源文件main.cpp, 又多了好多文件和文件夹 
这些都是临时文件和编译文件, 试一下,删除这些文件和活页夹 
只留下两个hello.pro和main.cpp 
打开QT Creator, 选择菜单 File => Open File or Project 
选择hello.pro文件, 打开 

然后编译运行, 又出现了一大堆文件 
其中还有两文件夹debug和release 
打开文件夹debug, 你会发现hello.exe和main.o 
而release文件夹中是空的 
选择菜单 Build => Set Build Configuration 子菜单有debug和release 
这是两种编译模式, 点选release再编译, 就会在release文件夹中产生编译后的文件 
你会发现release比debug文件更小, 
因为debug中包含了除错调试代码,而release没有 
当你的程序正式发布的时候,需要选择release 
---------------------------------------------------华丽的分割线---------------------------------------------------------- 
3.最简单的Dialog程序 

以前学VC的时候就是从对话框程序开始的, 
现在QTCreator一切照旧, 继续 

新建一個空工程 
File => New File or Project.=> Projects => Empty QT4 Project 
Name为mydlg 
Create in为D:\QT\sample\ 

右键工程名mydlg,选择菜单Add New 
选择C++ => C++ Source File, 命名为main.cpp 

这里因为要建立一个对话框 
所以需要建一个对话框类以及资源文件ui, 就像VC中的rc 

再添加一个C++源文件和一个头文件,操作如下 
Add New => C++ => C++ Source File, 命名为Dialog.cpp 
Add New => C++ => C++ Header File, 命名为Dialog.h 

再添加一个资源文件ui 
Add New => QT => Qt Designer Form, 这里选择一个样色 
习惯VC6的朋友可以选择templates\form => Dialog with Buttons Right 
在下放选择Embedded Design,我们选择默认选项 
这里新手有空可以每种样色都玩一玩 
然后Next, 命名为Dialog.ui保存 

OK,文件建好了,开始写入代码吧 
打开mydlg.pro,写入以下代码 

TARGET = mydlg 
TEMPLATE = app 
SOURCES += main.cpp \ 
    dialog.cpp 
HEADERS += dialog.h 
FORMS += dialog.ui 

这里如果一种类型有多个文件,可以用斜杠换行隔开 
打开各Dialog.h输入代码如下 

#ifndef DIALOG_H 
#define DIALOG_H 
#include <QDialog> 
namespace Ui 

    class Dialog; 

class Dialog : public QDialog 

    Q_OBJECT 
public: 
    Dialog(QWidget *parent = 0); 
    ~Dialog(); 
protected: 
    void changeEvent(QEvent *e); 
private: 
    Ui::Dialog *ui; 
}; 

#endif // DIALOG_H 

打开Dialog输入代码如下 

#include "dialog.h" 
#include "ui_dialog.h" 

Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 

    ui->setupUi(this); 


Dialog::~Dialog() 

    delete ui; 


void Dialog::changeEvent(QEvent *e) 

    QDialog::changeEvent(e); 
    switch (e->type()) { 
    case QEvent::LanguageChange: 
        ui->retranslateUi(this); 
        break; 
    default: 
        break; 
    } 


打开main.cpp输入代码如下 

#include <QtGui/QApplication> 
#include "dialog.h" 

int main(int argc, char *argv[]) 

    QApplication a(argc, argv); 
    Dialog w; 
    w.show(); 
    return a.exec(); 


此时 Build => Run 会看到一个简单的窗口 
如何在其上面做动作呢? OK,我们再来 

打开 Dialog.ui 
拖一个PushButton,放于窗口上,右键它,选择菜单 Go to slot 
这时会弹出一个对话框,选择Clicked(),按下OK 

这时会自动写入一个成员函数到Dialog类 
如下 
void Dialog::on_pushButton_clicked() 

    

在其中写入代码,如下 
void Dialog::on_pushButton_clicked() 

    QMessageBox::information( this, "mydlg", 
        "hello world" ); 

在最上放加个头文件 #include <QMessageBox> 

Build => Run 运行一下看看 
点那个按钮会弹出一个消息框哦 
---------------------------------------------------华丽的分割线----------------------------------------------------------
4.UI文件
可能有的新人会对ui文件有点迷惑,特别是只学过命令行模式编程的学生 
ui文件是个什么格式呢? 它是如何被编译器识别和编译的呢? 
我们打开QTCreator,新建一个Dialog工程 
File => New File or Project => Projects => Qt4 Gui Application 
按下OK,命名Name为text,保存在D:\QT\sample\ 
按两次Next, 选择Base Class为QDialog,按下一步,完成 

这时会自动生成一个Dialog类型的工程 
右键工程下的Forms => Dialog.ui, 选择菜单Open With => Plain TextEditor 
你会发现ui文件格式为XML, 
如下 
<ui version="4.0"> 
<class>Dialog </class> 
<widget class="QDialog" name="Dialog" > 
  <property name="geometry" > 
  <rect> 
    <x>0 </x> 
    <y>0 </y> 
    <width>600 </width> 
    <height>400 </height> 
  </rect> 
  </property> 
  <property name="windowTitle" > 
  <string>Dialog </string> 
  </property> 
</widget> 
<layoutDefault spacing="6" margin="11" /> 
<pixmapfunction> </pixmapfunction> 
<resources/> 
<connections/> 
</ui> 
但C++编译器又是如何编译XML格式的ui文件呢 
打开D:\QT\sample\test\ 
这里有5个文件,有工程文件,源文件,头文件以及ui文件 
分别是test.pro,main.cpp,dialog.cpp,dialog.h,dialog.ui 
现在回到QTCreator编译这个工程 
再看D:\QT\sample\test\ 
你看到,除了之前产生的那些临时的文件夹和文件 
还多了一个ui_dialog.h 
打开ui_dialog.h 
这是一个从ui文件产生的一个头文件 
也就是将XML格式的ui文件转换成编译器可以处理的源代码文件, 
然后再编译 

返回ui,在其窗口上加上一个PushButton, 
在其下方的Signals Slots Editor中,点"+"号按钮,增加一个信号槽 
Sender选择PushButton 
Signal选择clicked 
Receiver选择Dialog 
Slot选择close 
意思是按下这个按钮,就关闭对话框 

保存关闭dialog.ui,改用Plain TextEditor打开它 
你会发现多了一个连接 
如以下代码 
<connections> 
  <connection> 
  <sender>pushButton </sender> 
  <signal>clicked() </signal> 
  <receiver>Dialog </receiver> 
  <slot>close() </slot> 
  <hints> 
    <hint type="sourcelabel"> 
    <x>107 </x> 
    <y>141 </y> 
    </hint> 
    <hint type="destinationlabel"> 
    <x>299 </x> 
    <y>199 </y> 
    </hint> 
  </hints> 
  </connection> 
</connections> 
其中不难理解sender,signal,receiver,slot 

返回ui再加上一个PushButton,右键它,选择菜单Go to Slot, 然后选clicked 
如此Dialog类增加了一个自定义的成员函数 
void Dialog::on_pushButton_2_clicked() 

    


但是用Plain TextEditor打开dialog.ui后会发现没有上一个PushButton的连接connections 
打开ui_dialog.h也没有发现与此相关的连接 
---------------------------------------------------华丽的分割线----------------------------------------
5.我再介绍一下动态编译和静态编译的问题吧,就当是散分了 

QT Creator默认是动态编译,发布时需要打包多个dll进来, 
在windows下很多人希望只有一个exe即可运行于任何电脑上 

改用静态编译很简单,在开始菜单打开Qt Command Prompt 
输入configure -release -static -fast 按回车,然后选择是商业版还是社区版本 
然后就输入mingw32-make开始编译了,时间很长, 
如果在C盘需要注意硬盘大小,编译之后的C:\Qt\2009.05有两个多G 
完成之后用mingw32-make clean删除编译产生的临时文件,这样C:\Qt\2009.05这个文件夹会缩小到1.5G左右 
打开QT Creator之后在Build => Set Build Configuration设置为release, 
编译之后的exe将完全包含了QT类库,大小是8M多点 
此时拷贝到其他电脑还需要mingwm10.dll,如果想只要一个exe即可运行,则需要设置编译去除mthreads选项 
因为只有用到thread的时候才会需要mingwm10.dll 
其实也不需要如此,因为mingwm10.dll也只有11KB大小而已 

好了不多说了,浪费了大家的时间我感到很抱歉!
---------------------------------------------------华丽的分割线----------------------------------------
 
6.实在抱歉,最近琐事缠身,现在才... 

先说多窗体吧, 大致说下, 这里我就不细讲了,因为很简单. 

打开QT Creator, 新建一个Gui Application,全部默认下一步,该怎样怎样,然后完成 

建好工程,右键工程名(这里是最上面的黑体的工程名,不是.pro文件) => Add New => QT Designer Form 

然后 Next , Next , Finish 就新建了一个名叫Dialog的对话框 

打开Dialog.ui, 在上面放一个Text Edit和一个PushButton 
同样打开mainwindow.ui,放一个Text Edit 和 PushButton 

打开Dialog.h, 给Dialog Class加上两个成员函数如下 
class Dialog : public QDialog { 
........ 
public: 
    void SetText(QString m_Text); 
    QString GetText(); 
....... 
}; 
打开Dialog.cpp, 最下面写入如下代码 
void Dialog::SetText(QString m_Text) 

    ui->textEdit->setText(m_Text); 

QString Dialog::GetText() 

    return ui->textEdit->toPlainText(); 

打开mainwindow.ui,右键那个PushButton => Go to Slot => 选择clicked => OK 
就会进入mainwindow.cpp,并且自动产生一个成员函数如下 
void MainWindow::on_pushButton_clicked() 


在mainwindow.cpp最上面加如下代码 
#include "dialog.h" 

在成员函数中加入如下代码 
void MainWindow::on_pushButton_clicked() 

    Dialog dlg(this); 
    dlg.SetText("Hello World"); 
    if(dlg.exec()==QDialog::Accepted) 
    { 
        ui->textEdit->setText(dlg.GetText()); 
    } 

编译运行, 就可以在两个窗体之间相互传递值了

补充:
如果只是在两个窗口之间,传递单个控件的值,则只需要将其指向控件的指针设置为public即可,如下 
class Dialog : public QDialog { 
....... 
public: 
    QTextEdit *m_edit; 
......... 
}; 
然后在构造函数中将其指向ui->控件地址,如下 
Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 

    ui->setupUi(this); 
    m_edit=ui->textEdit; 

然后在两个窗口间传递此控件就会简单了, 如下 
void MainWindow::on_pushButton_clicked() 

    Dialog dlg(this); 
    //dlg.SetText("Hello World"); 
    dlg.m_edit->setText(ui->textEdit->toPlainText()); 
    if(dlg.exec()==QDialog::Accepted) 
    { 
        //ui->textEdit->setText(dlg.GetText()); 
        ui->textEdit->setText(dlg.m_edit->toPlainText()); 
    } 
}

如果是在两个窗口间传递多组值,以及夹带一些算法,则用第一种为子窗口增加成员函数的方法会很简单
 
---------------------------------------------------华丽的分割线----------------------------------------
7.下面介绍数据库 

以前在windows下最简单最常用的是Access数据库 
但是现在不同了,sqlite比Access还要简单,只有一个文件到处可运行,也不需要Office支持^_^ 

有的新手对这快可能有点疑惑, 所以分开讲,一步一步来 

打开QT Creator,新建一个空工程,Empty Qt4 Project 
Name为sql_sample 
Creator in为D:\QT\sample\ 
然后Next Finish 

右键工程名sql_sample => Add New => C++ Source File 取名main.cpp 

打开main.cpp输入如下代码 
#include <QApplication> 
#include <QtSql> 
#include <QTableView> 
#include <QMessageBox> 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 

//先看看数据库文件是否存在 
    bool I***ist=QFile::exists("mydb.dat"); 
//连接数据库,如果不存在则新建一个 
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
    db.setDatabaseName("mydb.dat"); 
    if(!db.open()) 
    { 
//如果无法打开则报错 
        QMessageBox::warning(0,"title","打开数据库失败"); 
        return 1; 
    } 
//如果是新建的数据库,先初始化,建个表,输入一点点内容 
    if(I***ist==false) 
    { 
        QSqlQuery query; 
        query.exec("create table t_user(f_id,f_name,f_phone);"); 
        query.exec("insert into t_user(f_id,f_name,f_phone)values(1,'kenneth','87654321');"); 
        query.exec("insert into t_user(f_id,f_name,f_phone)values(2,'cindy','123456');"); 
        query.exec("insert into t_user(f_id,f_name,f_phone)values(3,'mike','888777');"); 
    } 
//一般数据库表中的内容用QTableView显示比较好,就像VC中的CListView 
    QSqlQueryModel *model = new QSqlQueryModel; 
    model->setQuery("select * from t_user"); 
    model->setHeaderData(0, Qt::Horizontal, "ID"); 
    model->setHeaderData(1, Qt::Horizontal, "Name"); 
    model->setHeaderData(2, Qt::Horizontal, "Phone"); 

    QTableView *view = new QTableView; 
    view->setWindowTitle("QSqlQueryModel"); 
    view->setModel(model); 
    view->show(); 

    db.close(); 

    return app.exec(); 


打开sql_sample.pro,输入如下 
QT      += sql 
TARGET = sql_sample 
TEMPLATE = app 
SOURCES += main.cpp 

注意第一行 "QT += sql",这是加入对数据库模块的支持,必须要有噢 

编译运行,看看效果
---------------------------------------------------华丽的分割线----------------------------------------
如果只是在两个窗口之间,传递单个控件的值,则只需要将其指向控件的指针设置为public即可,如下
class Dialog : public QDialog {
.......
public:
  QTextEdit *m_edit;
.........
};
然后在构造函数中将其指向ui->控件地址,如下
Dialog::Dialog(QWidget *parent) :
  QDialog(parent),
  ui(new Ui::Dialog)
{
  ui->setupUi(this);
  m_edit=ui->textEdit;
}
然后在两个窗口间传递此控件就会简单了, 如下
void MainWindow::on_pushButton_clicked()
{
  Dialog dlg(this);
  //dlg.SetText("Hello World");
  dlg.m_edit->setText(ui->textEdit->toPlainText());
  if(dlg.exec()==QDialog::Accepted)
  {
  //ui->textEdit->setText(dlg.GetText());
  ui->textEdit->setText(dlg.m_edit->toPlainText());
  }
}

为了使更多的Qt初学者能尽快入门Qt,也为了QtQt Creator的快速普及,我们花费大量精力写出了这一系列教程。虽然教程的知识可能很浅显,虽然教程的语言可能不规范,但是它却被数十万网友所认可。我们会将这一系列教程一直写下去,它将涉及Qt的方方面面 一、Qt Creator的安装和hello world程序的编写 二、Qt Creator编写多窗口程序 三、Qt Creator登录对话框 四、Qt Creator添加菜单图标 五、Qt Creator布局管理器的使用 六、Qt Creator实现文本编辑 七、Qt Creator实现文本查找 八、Qt Creator实现状态栏显示 九、Qt Creator中鼠标键盘事件的处理实现自定义鼠标指针 十、Qt Creator中实现定时器和产生随机数 十一、Qt 2D绘图(一)绘制简单图形 十二、Qt 2D绘图(二)渐变填充 十三、Qt 2D绘图(三)绘制文字 十四、Qt 2D绘图(四)绘制路径 十五、Qt 2D绘图(五)显示图片 十六、Qt 2D绘图(六)坐标系统 十七、Qt 2D绘图(七)Qt坐标系统深入 十八、Qt 2D绘图(八)涂鸦板 十九、Qt 2D绘图(九)双缓冲绘图简介 二十、Qt 2D绘图(十)图形视图框架简介 二十一、Qt数据库(一)简介 二十二、Qt数据库(二)添加MySQL数据库驱动插件 二十三、Qt数据库(三)利用QSqlQuery类执行SQL语句(一) 二十四、Qt数据库(四)利用QSqlQuery类执行SQL语句(二) 二十五、Qt数据库(五)QSqlQueryModel 二十六、Qt数据库(六)QSqlTableModel 二十七、Qt数据库(七)QSqlRelationalTableModel 二十八、Qt数据库(八)XML(一) 二十九、Qt数据库(九)XML(二) 三十、Qt数据库(十)XML(三) 三十一、Qt 4.7.0及Qt Creator 2.0 beta版安装全程图解 三十二、第一个Qt Quick程序(QML程序) 三十三、体验QML演示程序 三十四、Qt Quick Designer介绍 三十五、QML组件 三十六、QML项目之Image和BorderImage 三十七、Flipable、Flickable和状态与动画 三十八、QML视图 三十九、QtDeclarative模块 四十、使用Nokia Qt SDK开发Symbian和Maemo终端软件 四十一、Qt网络(一)简介 四十二、Qt网络(二)HTTP编程 四十三、Qt网络(三)FTP(一) 四十四、Qt网络(四)FTP(二) 四十五、Qt网络(五)获取本机网络信息 四十六、Qt网络(六)UDP 四十七、Qt网络(七)TCP(一) 四十八、Qt网络(八)TCP(二)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值