QT Creater

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.To jpchen609 & wxdcxp
這裏只是介紹一下怎麼添加源文件而已

也許我真不應該發這個帖子
這個IDE的使用真沒啥可寫的,點點看看就會了
至於QT庫的使用,可以看 <C++ GUI Programming with Qt 4>

我再介紹一下動態編譯和靜態編譯的問題吧,就當是散分了

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 IsExist=QFile::exists("mydb.dat");
//連接數據庫,如果不存在則新建一個
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("mydb.dat");
    if(!db.open())
    {
//如果無法打開則報錯
        QMessageBox::warning(0,"title","打開數據庫失敗");
        return 1;
    }
//如果是新建的數據庫,先初始化,建個表,輸入一點點內容
    if(IsExist==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",這是加入對數據庫模塊的支持,必須要有噢

編譯運行,看看效果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章