一 準備工作
虛擬機VMWare已安裝Linux開發版本爲 RedHat9
Qt安裝包已下載,爲:qt-x11-opensource-src-4.5.3.tar.gz
QtCreator安裝包已下載,爲:qt-creator-1.2.1-src.zip (需要qt 4.5.0支持 即可)
二 安裝Qt4.5.3
2、進入到/root/qt目錄:
tar -zxvf qt-x11-opensource-src-4.5.3.tar.gz ----即解壓安裝包
cd qt-x11-opensource-src-4.5.3 ----進入目錄
./configure ----生成Makefile文件
注意:根據提示,選擇開源版本,並接受協議要求;最後會提示qt安裝在/usr/local/Trolltech/Qt-4.5.3目錄下
gmake ----編譯
注意:編譯會出現錯誤而停止:提示找不到krb5.h,這是因爲RedHat9是將認證服務kerberos的include file放在了/usr/kerberos/include裏,而不是/usr/include下。
執行下面的命令可以解決
ln -s /usr/kerberos/include/com_err.h /usr/include
ln -s /usr/kerberos/include/profile.h /usr/include
ln -s /usr/kerberos/include/krb5.h /usr/include
重新運行gmake ----編譯成功。但耗時約1小時
gmake install ----安裝Qt.大約需要20分鐘
Qt安裝完成
3、修改/etc/profile:
在PATH的最前面,加上/usr/local/Trolltech/Qt-4.5.3/bin。這是爲了將Qt的可執行命令,加入到搜索路徑中。
4、重啓Linux後,在shell下執行命令designer,應該可以打開Qt4.5.3版本的設計器。
三 安裝QtCreator1.2.1
unzip qt-creator-1.2.1-src.zip ----解壓安裝包
cd qt-creator-1.2.1-src ----進入目錄
qmake qtcreator.pro ----編譯 qtcreator.pro工程文件
make ----需要約1小時
2、安裝完成,運行QtCreator
方法:在qt-creator-1.2.1-src/bin/目錄下
./qtcreator ----QtCreator1.2.1程序應會被打開
四 QtCreator與Qt庫的關聯設置
1、打開QtCreator1.2.12、在菜單中依次選 Tools----Option----Qt4
QtCreator與Qt應已經自動關聯了;如沒有自動關聯,需要手動關聯,即需要制定Qt4.5.3的路徑/usr/local/Trolltech/Qt-4.5.3
調試助手Debugging Help應還沒有配置,點擊 Rebuild後,調試助手Debugging Help構建完成
至此,Qt開發環境搭建完畢
五 自動生成GUI框架的編程步驟:
2、新建工程項目
依次選取 Qt4 GUI應用----修改工程項目路徑----修改工程名----修改Base class基類(可以爲QMainWindow、QWidget、QDialog )----修改Class name類名
3、在界面中,即設計器上,可以添加任意部件,如1個Label
4、檢查項目和代碼,發現代碼都已自動生成
自動生成了main.cpp、派生於某個基類的類文件(包括h和cpp文件各1個)、1個ui文件
5、main.cpp代碼基本如下:
#include "hello01dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Hello01Dialog w;
w.show();
return a.exec();
}
六 解決中文亂碼問題:
在main函數裏第2行開始,增加下列語句:
QTextCodec *codec=QTextCodec::codecForLocale();
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec);
七 案例
開發步驟:
1、建立Qt4 GUI應用程序
2、將主界面的 標題WindowTitle改爲 ---管理系統主界面
3、點擊項目右鍵----新建----選 Qt設計器Form Class----類名該爲 LoginDialog ----建立1個 登錄窗口類LoginDialog
4、利用圖形界面,修改登錄窗口的標題WindowTitle改爲----登錄窗口
5、在登錄窗口上增加下列 組件(控件)
QLabel 用戶名 QLineEdit (可以輸入用戶名)
QLabel 密碼 QLineEdit (可以輸入密碼)
QButton 登錄 QButton 取消
6、點擊 登錄----右鍵----選擇 Go to Slot 可以自動產生1個成員函數,該函數可以判定 用戶名/密碼是否正確;如果正確,將進入主界面,否則會有錯誤提示,需要重新輸入
7、點擊 取消----右鍵----選擇 Go to Slot 可以自動產生1個成員函數,該函數將導致 程序退出,即不再登錄了。
代碼:
//main.cpp
#include <QtGui/QApplication>
#include "test01widget.h"
#include "logindialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec *code=QTextCodec::codecForLocale();
QTextCodec::setCodecForCStrings(code);
QTextCodec::setCodecForLocale(code);
QTextCodec::setCodecForTr(code);
Test01Widget w;
LoginDialog logDialog01;
int flag=logDialog01.exec(); //返回值 如果是QDialog::Accepted,則說明是 登錄窗口是正常關閉的;否則,是非正常關閉,意味着整個程序都應該退出
if(flag==QDialog::Accepted)
{
w.show(); //登錄窗口正常關閉後,執行該語句後,主界面窗口才會顯示出來
}
else
{
//exit(1);
return 1; //登錄窗口是非正常關閉的,因此執行該語句後,整個程序將退出
}
return a.exec();
}
//logindialog.cpp文件
#include "logindialog.h"
#include "ui_logindialog.h"
LoginDialog::LoginDialog(QWidget *parent) :
QDialog(parent),
m_ui(new Ui::LoginDialog)
{
m_ui->setupUi(this);
}
LoginDialog::~LoginDialog()
{
delete m_ui;
}
void LoginDialog::changeEvent(QEvent *e)
{
QDialog::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
m_ui->retranslateUi(this);
break;
default:
break;
}
}
void LoginDialog::on_pushButton_clicked() //點擊 登錄按鈕後,將執行 該函數
{
QString userName=m_ui->lineEdit->text(); //獲取 用戶名---注意字符串的類型是 QString
QString password=m_ui->lineEdit_2->text();
if(userName=="zhangsan" && password=="123456")
{
accept(); //該函數 會導致 當前的登錄窗口關閉,而且是正常關閉。它將影響main.cpp中 loginDialog.exec()函數的返回值
}
else
{
QMessageBox::warning(this,"告警提示","用戶名和密碼不符!"); //利用QMessageBox類的靜態成員函數 warning,產生 告警窗口
//reject(); //不應該使用 該函數。它會導致 當前的登錄窗口關閉,而且是非正常關閉。它將影響main.cpp中 loginDialog.exec()函數的返回值
}
return;
}
void LoginDialog::on_pushButton_2_clicked()
{
reject(); //它會導致 當前的登錄窗口關閉,而且是非正常關閉。它將影響main.cpp中 loginDialog.exec()函數的返回值
//close(); //該函數可不用,因爲reject函數已包含了該功能。
}
//窗口間的消息傳遞----利用parentWidget()函數
//案例:登錄成功後,進入主界面,發現主界面的 WindowTitle標題,變成了 登錄的用戶名
//步驟:
//1、修改main.cpp
// LoginDialog logDialog01; 修改爲 LoginDialog logDialog01(&w); //即將 父窗口的地址,賦值給 登錄窗口,因爲登錄窗口,後面要用到
//2、 修改 單擊 登錄按鈕 觸發的函數
void LoginDialog::on_pushButton_clicked() //點擊 登錄按鈕後,將執行 該函數
{
QString userName=m_ui->lineEdit->text(); //獲取 用戶名---注意字符串的類型是 QString
QString password=m_ui->lineEdit_2->text();
if(userName=="zhangsan" && password=="123456")
{
((Test01Widget *)parentWidget())->setWindowTitle(userName); //parentWidget()函數可以得到父窗口的地址,但必須進行強制類型轉換;然後調用父窗口的成員函數,重新設置了標題。
accept(); //該函數 會導致 當前的登錄窗口關閉,而且是正常關閉。它將影響main.cpp中 loginDialog.exec()函數的返回值
}
else
{
QMessageBox::warning(this,"告警提示","用戶名和密碼不符!"); //利用QMessageBox類的靜態成員函數 warning,產生 告警窗口
//reject(); //不應該使用 該函數。它會導致 當前的登錄窗口關閉,而且是非正常關閉。它將影響main.cpp中 loginDialog.exec()函數的返回值
}
return;
}
//注意:
// 因爲使用了 Test01Widget類,所以,該cpp文件前,要加 Test01Widget類的頭文件
// 讓密碼 不可見
// 方法:在屬性欄,修改密碼LineEdit控件的EchoMode爲 Password即可