Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5609698
  • 博文数量: 922
  • 博客积分: 19333
  • 博客等级: 上将
  • 技术积分: 11226
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 14:33
文章分类

全部博文(922)

文章存档

2023年(1)

2020年(2)

2019年(1)

2017年(1)

2016年(3)

2015年(10)

2014年(17)

2013年(49)

2012年(291)

2011年(266)

2010年(95)

2009年(54)

2008年(132)

分类: C/C++

2013-10-22 15:45:22

原文地址:QT入门 & QT Creator 使用 作者:liutaolinux

 
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());
  }
}

阅读(2707) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~