1.从Hello World开始
见很多新人问如何使用QT Creator
感觉还是抽点时间出来,写一个QT Creator使用帮助吧
首先下载,地址如下
安装很简单,直接默认,点下一步即可
安装好之后,打开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
#include
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
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
#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
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,
如下
Dialog
0
0
600
400
Dialog
但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打开它
你会发现多了一个连接
如以下代码
pushButton
clicked()
Dialog
close()
107
141
299
199
其中不难理解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
#include
#include
#include
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());
}
}