摘要:在工程建設(shè)過程當(dāng)中,有時(shí)需要使用許多數(shù)學(xué)公式計(jì)算出相應(yīng)的數(shù)據(jù),然而有一些數(shù)學(xué)公式計(jì)算起來比較麻煩,同時(shí)可以使用軟件開發(fā)工具編寫相應(yīng)的軟件來解決這個(gè)問題。使用Qt即可以可視化編寫軟件,也可以純代碼編寫。為明了編寫軟件過程中所用思想、處理過程、操作方法,該文舉例介紹使用純代碼編寫軟件。首先在Qt的安裝目錄下新建一文件夾,再在此目錄下新建四個(gè)文本文件,編寫相應(yīng)代碼后重命名文本文件為頭文件或者C++文件,然后在命令行輸入命令,最后生成相應(yīng)的軟件。
關(guān)鍵詞:Qt;純代碼;編寫軟件;實(shí)例
中圖分類號(hào):TP311.5 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)27-0072-03
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
Qt是1994年成立的總部位于挪威奧斯陸的奇趣科技公司(Trolltech)提供的跨平臺(tái)C++圖形界面應(yīng)用程序開發(fā)框架[1]。它最初由Haavard Nord(Trolltech的CEO)和Eirik chambe-Eng(Trolltech的總裁)開發(fā)[2]。當(dāng)時(shí)這個(gè)工具之所以取名為Qt,是因?yàn)樵贖aavard的Emacs字體中,字母Q看起來非常漂亮;而字母t的靈感則來源于當(dāng)時(shí)的另一個(gè)工具Xt(X toolkit)的取名[3]。2008年Qt被Nokia公司收購,2012年8月Qt軟件業(yè)務(wù)出售給芬蘭IT服務(wù)公司Digia[4]。Qt支持多種平臺(tái),如MS Windows、Linux/U nix、Mac OS及Android、iOS、Windows 8(WinRT)、Black-Berry 10、QNX、VxWorks、嵌入式Linux等移動(dòng)設(shè)備和嵌入式平臺(tái)[5]。Qt強(qiáng)有力地支持著來自70多個(gè)行業(yè)中的主要企業(yè)開發(fā)了數(shù)以百萬計(jì)的產(chǎn)品,也是財(cái)富500強(qiáng)企業(yè)前10個(gè)企業(yè)中的5個(gè)所選擇的開發(fā)技術(shù)[6]。本文使用的是Windows 7桌面平臺(tái),Qt版本為Qt5.6.1.Qt5.6.1的下載與安裝、設(shè)置構(gòu)建套件、環(huán)境變量設(shè)置可分別參照文獻(xiàn)[15]正文第2-3頁、第6頁、第19 - 21頁。
1 窗口設(shè)計(jì)
根據(jù)需要確定出窗口尺寸,需要嵌入哪些窗口部件,部件位置。部件位置是指部件左上方那個(gè)點(diǎn)的橫坐標(biāo)與縱坐標(biāo)。以根據(jù)掘進(jìn)斷面面積S和巖石堅(jiān)固性系數(shù)f估算炮眼數(shù)目N公式為例編制一炮眼數(shù)估算器,其窗口如圖1所示。
根據(jù)掘進(jìn)斷面面積S和巖石堅(jiān)固性系數(shù)f估算炮眼數(shù)目N公式如(1)[7]所示:
2 代碼編寫
假設(shè)Qt安裝在E盤中,在E:\Qt中新建文件夾BINumEst(Blasthole number estimation縮寫),然后在其中新建四個(gè)文本文件,編寫相應(yīng)代碼后分別保存為ui_widegt.h、widegt.h、widegt.cpp.main.cpp。
在ui_widegt.h中添加的代碼如下:
#ifndef UI_WIDEGT_H//與下面”endif”成對(duì)出現(xiàn),檢查名為”ui_widegt'的頭文件是否被定義過
#defme UI_WIDEGT_H//定義名為”ui_widegt”的頭文件
#include //定義UI_WIDEGT_H需要調(diào)用的頭文件
#include
#include< QtWidgets/QApplication>
#include< QtWidgets/QButtonGroup>
#include< QtWidgets/QHeaderView>
#include< QtWidgets/QLabel>
#include< QtWidgets/QLineEdit>
#include< QtWidgets/Q PushButton>
#include
QT_BEGIN_NAMESPACE//開始宏[8]30
class Ui_Widegt//定義名為”Ui_Widegt”的類
{
public:
QLabel *label_1;//定義QLabel類的對(duì)象指針
QLabel *label_2;
QLabel *label_3;
QLineEdit *lineEdit_l;//定義QLineEdit類的對(duì)象指針
QLineEdit *lineEdit_2;
QLineEdit *lineEdit_3;
QPushButton *pushButton;//定義QPushButton類的對(duì)象指針
void setupUi(QWidget *Widegt)//定義一個(gè)生成界面的函數(shù)
(
if (Widget->obj ectName O.isEmptyO)
Widget->setObj ectName(QStringLiteral(' Widget”));ll如果對(duì)象名為空,將對(duì)象名設(shè)置為”Widegt"
Widegt->resize(210, 210);//設(shè)置窗口的寬和高
QFont font;//新建字體
font. setFamily(QStringLiteral(" Cambria Math"));//字體的種類為”Cambria Math"
font.setPointSize(18); 11字體的大小為18
label_l= new QLabeI(Widegt);//新建窗口部件,(Wide-gt說明部件在創(chuàng)建的對(duì)象Widegt的窗口內(nèi)
label_l->setObj ectName(QStringLiteral ("Iabel_l”));//令部件的對(duì)象名為”label_l"
label_l->setGeometry(QRect(30, 20, 26, 30》;//確定音B件的橫坐標(biāo)、縱坐標(biāo)、寬、高
label_l->setFont(font);//新建的部件使用設(shè)置好的font字體
label_2= new QLabel(Widegt);
label_2->seto bj ectName(QStringLiteral("Iabel_2”));
label_2->setGeometry(QRect(30, 60, 26, 30》;
label_2->setFont(font);
label_3= new QLabeI(Widegt);
label_3->setObjectName(QStringLiteral( 'labeL3”));
labeL3->setGeometry(QRect(30, 100, 26, 30》;
labeL3->setFont(font);
lineEdit_l= new QLineEdit(Widegt);
lineEdit_l->setObj ectName(QStringLiteral("Iine-EdiL1“));
lineEdit_l->setGeometry(QRect(60, 20, 120, 30》;
lineEdit_l->setFont(font);
lineEdit_2= new QLineEdit(Widegt);
lineEdit_2->setObj ectName(QStringLiteral(' 'line-EdiL2”));
lineEdit_2->setCeometry(QRect(60, 60, 120, 30》;
lineEdit_2->setFont(font);
lineEdit_3= new QLineEdit(Widegt);
lineEdit_3->setObj ectName(QStringLiteral(' 'Iine-Edit_3”));
lineEdit_3->setGeometry(QRect(60, 100, 120, 30));
lineEdit_3->setFont(font);
pushButton= new QPushButton(Widegt);
pushButton->setObj ectName(QStringLiteral("pushBut-ton“));
pushButton->setC eometry(QRect(75, 150, 60, 30》;
pushButton->setFont(font);
retranslateUi(Widget);//對(duì)Widegt調(diào)用能對(duì)窗口內(nèi)的字符串進(jìn)行編碼的函數(shù)
QMetaObject:: connectSlotsByName(Widget);//調(diào)用了QMetaObject類的connectSlotsByName0靜態(tài)函數(shù),使得窗口中的部件可以實(shí)現(xiàn)按對(duì)象名進(jìn)行信號(hào)和槽的關(guān)聯(lián)[8po
)//setupUi
void retranslateUi(QWidget *Widget)//定義retranslateUi0函數(shù)
{
Widget->setWindowTitle(QApplication:: translate(' 'Wid-get”,”Widget", 0》;//設(shè)置窗口標(biāo)題為”Widegt”
label_l->setText (QApplication:: translate("Widget",”f.”,0》;//設(shè)置標(biāo)簽label_l顯示字符串”f.”
label_2->setText(QApplication:: translate("Widget", "S:“,0》;//設(shè)置標(biāo)簽labeL2顯示字符串”s:"
label_3->setText(QApplication:: translate("Widget", "N:”,0》;//設(shè)置標(biāo)簽label_3顯示字符串”N:"
pushButton->setText(QApplication:: translate(' Widget",”\350\256\241\347\256\227", 0》;設(shè)置按鈕pushButton顯示字符串”計(jì)算”,字符串”\350\256\241\347\256\227”是”計(jì)算”的UTF-8編碼
1,/retranslateUi
);
namespace Ui(//定義了一個(gè)命名空間Uic8]30,在其中又定義了一個(gè)繼承自Ui_Widegt類的Widegt類
class Widegt: public Ui_Widegt{};
)//namespace Ui
QT_END_NAMESPACE//結(jié)束宏[8]30
#endif//UI_WIDEGT_H
向widegt.h文件中添加如下代碼:
#ifndef WIDEGT_H//與下面”endif”成對(duì)出現(xiàn),檢查名為”widegt”的頭文件是否被定義過
#define WIDE GT_H//定義名為”widegt'的頭文件
#include //引用QWidget類頭文件
namespace Ui(//定義了一個(gè)命名空間Ui,在其中又定義了一個(gè)繼承自Ui_Widegt類的Widegt類
class Widegt;
)
class Widegt:public QWidget//定義公共繼承QWidget類的Widget類
{
Q_OBJECT//定義了Q_OBJECT宏,擴(kuò)展了普通C++類的功能[9]36
public:/,聲明Widget類的公有成員
explicit Widegt(QWidget *parent= 0);//是顯示構(gòu)造函數(shù),參數(shù)是用來顯示父窗口的,默認(rèn)是沒有父窗口的[9]36
-Widegt0;//聲明析構(gòu)函數(shù)
private slots: ll定義Widget類的私有槽
void on_pushButton_clicked();
private://定義Widget類的私有成員
Ui::Widegt *ui;,/創(chuàng)建Widget類的對(duì)象指針
};
#endif//WIDGET_H
往widegt.cpp文件添加如下的代碼:
#include”widegt.h”//調(diào)用widegt.h頭文件
#include”ui_widegt.h”//調(diào)用ui_widegt.h頭文件
#include//調(diào)用math.h頭文件,因?yàn)橄旅嫘枰褂闷渲械膒ow0函數(shù)
Widegt:: Widegt(QWidget *parent)://Widegt類中的構(gòu)造函數(shù)
QWidget(parent),
ui(new Ui::Widegt)//在Ui中新建Widegt類對(duì)象,名為Ul
{
this->setMaximumSize(210,210);//新建的窗口最大尺寸為2lOx210
this->setMinimumSize(210,210);//新建的窗口最小尺寸為2lOx210
ui->setupUi(this); ll令this代表新建的窗口
)
Widegt::-Widegt() /fWidegt類中的析構(gòu)函數(shù)
{
delete ui; ll銷毀對(duì)象Ul
)
void Widegt:: on_pushButton_clicked0//定義與按鈕push-Button相關(guān)聯(lián)的模塊
{
//定義double型變量f,將輸入lineEdit_l的數(shù)字轉(zhuǎn)換成double型再賦值給f
double f=ui->lineEdit_l->textO.toDouble0;
,/定義double型變量S,將輸入lineEdit_2的數(shù)字轉(zhuǎn)換成double型再賦值給S
double S=ui->lineEdit_2->textO.toDouble0;
//定義double型變量N,將傳給lineEdit_3的數(shù)字轉(zhuǎn)換成double型再賦值給N
double N=ui->lineEdit_3->textO.toDouble();
N=3.3*pow《f*S*S),1.0/3); 11根據(jù)掘進(jìn)斷面面積和巖石堅(jiān)固性系數(shù)估算炮眼數(shù)目公式
//將以上公式計(jì)算出來的N值傳送給lineEdit_3
ui->lineEdit_3->setText(QString:.number(N》;
)
在main.cpp文件里添加以下代碼:
#include”widegt.h”//調(diào)用widegt.h頭文件
#include //調(diào)用QApplication類
int main(int argc。char *argvD)//因?yàn)镼t程序可以接受命令行參數(shù),所以它需要argc和argv兩個(gè)參數(shù)[9126
{
QApplication a(argc,argv);//新建QApplication類對(duì)象
Widegtw;//新建Widegt類對(duì)象
w.setWindowTitle(QObject::tr(”炮眼數(shù)估算器”));//設(shè)置窗口的標(biāo)題為”炮眼數(shù)估算器”
w.show0;//使窗口顯示出來
return a.exec0;//執(zhí)行指令
)
3 在命令行編譯軟件
首先用鼠標(biāo)左鍵單擊順序如下:“開始”一“所有程序”一“Qt 5.6.1”一“5.6”一“MinGW 4.9.2 (32-bit)'一“Qt 5.6 for Desk-top (MinGW 4.9.2 32 bit)'。之后命令行窗口打開,其次按以下順序輸入命令:“cd E:\Qt\BINumEst”一“qmake -project”(輸入此命令后,在BINumEst目錄中已經(jīng)生成了BINumEst.pro文件。下面使用記事本打開該文件,然后在最后面添加如下一行代碼:greaterThan(QT_MAJOR_VERSION, 4): QT+=widgets[10])→“qmake”→“mingw32-make"_→cd release"→“BINumEst. exe”。最后BINumEst.exe可執(zhí)行文件在BINumEst目錄中的release目錄中生成,炮眼數(shù)估算器窗口彈出。軟件的發(fā)布參見文獻(xiàn)[10]第21頁。
4 結(jié)束語
可視化編寫軟件方便、快捷,同時(shí)使用純代碼編寫軟件能更好地理解編寫軟件過程中所用思想、處理過程、操作方法,對(duì)深入學(xué)習(xí)Qt很有幫助。在編寫代碼過程中,需注意命名文件不能用中文,否則會(huì)出錯(cuò)。若需要了解生成pro工程文件里的代碼,可以參見文獻(xiàn)[10]第25頁與第40頁,亦可參見文獻(xiàn)[9]第38頁與第39頁。
參考文獻(xiàn):
[1]殷立峰.Qt C++跨平臺(tái)圖形界面程序設(shè)計(jì)基礎(chǔ)[M].北京:清華大學(xué)出版社,2014.
[2]陳志發(fā),王苑增,嵌入式Qt實(shí)戰(zhàn)教程[M].北京:電子工業(yè)出版社,2015.
[3]霍亞飛,程梁.Qt 5編程入門[M].北京:北京航空航天大學(xué)出 版社,2015.
[4)鮑忠貴,王濤,陳凌暉.Qt編程快速入門[M].北京:清華大學(xué)出版社,2016.
[5]金大彌.Qt 5開發(fā)實(shí)戰(zhàn)[M].張紅艷譯,北京:人民郵電出版社,2015.
[6]安曉輝.Qt on Android核心編程[M].北京:電子工業(yè)出版社,2015.
[7]許建聰,地下工程施工技術(shù)[M].北京:中國(guó)建筑工業(yè)出版社,2015.
[8]霍亞飛.Qt Creator快速入門[M].北京:北京航空航天大學(xué)出版社,2012.
[9]霍亞飛.Qt Creator快速入門[M].2版.北京:北京航空航天大學(xué)出版社,2014.
[10]霍亞飛.Qt Creator快速入門[M].3版,北京:北京航空航天大學(xué)出版社,2017.
【通聯(lián)編輯:王力】
作者簡(jiǎn)介:段振虎(1986-),男,重慶人,工程師,本科,主要從事土木工程研究。