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",這是加入對資料庫模組的支援,必須要有噢
編譯運行,看看效果
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/sunruiy/archive/2009/12/25/5071648.aspx