Qt中的QString類簡述以及計算器的簡單實現
字串類:QString
QString類儲存16位Unicode值,提供了豐富的操作,查詢和轉換等函式,該類還進行了使用隱式共享,高效的記憶體分配策略
1. 操作字串:
+;將兩個字串組合
+=:將一個字串追加到另一個字串末尾
QString::append():也有在字串末尾追加另一個字串的功能
QString::sprintf():
QString str1;
str。sprintf(“%s”,”Welcome”)
str。sprintf(“%s”,”to you”)
QString::arg():
QString str;
Str=QString(“%1 was born in %2。 “)。arg(“John”)。arg(“1998”)
(%1替換為“John” %2替換為“1998”)
QString::insert()在指定位置插入另一個字串
QString::prepend:在原字串的開頭插入另一個字串
QString::replace:用指定的字串替換原字串中的某些字元
QString::trimmed():移除字串兩端的空白字元
QString::simplified():移除字串兩端的空白字元並用單個空格字元代替字串中出現的空白字元
2. 查詢字串資料:
QString::startsWith():判斷一個字串是否以某個字串開頭、
QString::endsWith():判斷一個字串是否以某個字串作為結尾
QString::contains()判斷一個指定的字串是否出現過
<(const String&):比較一個字串是否小於另一個字串
>(const String&):比較一個字串是否大於另一個字串
==(const String&):比較一個字串是否等於另一個字串
>=(const String&):比較一個字串是否不小於另一個字串
localAwareCompare(const QString&,const QSrting&)
靜態函式,比較前後兩個字串。如果前面字串小於後面字串,返回負數值,等於返回0,如果大於則返回正整數。
該函式的比較是基於本地字符集的而且是平臺相關的。
compare(const QString&, const QString&, Qt::CaseSensitivity):
該函式可以指定是否進行大小寫的比較,而大小寫的比較是完全基於字元的Unicode編碼值 的,而且是非常快的,返回值類似於localAwareCompare()
3. 字串的轉換:
QString類提供了豐富的轉換函式,可以將字串轉換為數值型別或者其他的字符集編碼
(1) 數值型別
toInt(),toDouble(),toFloat(),toLong(),toLongLong()等
QStringstr=“125”;
bool ok;
int hex=str。toInt(&ok,16);(16進位制數字字串轉十進位制數字)
int dec= str。toInt(&ok,10);
其中int hex=str。toInt(&ok,16):呼叫QString::toInt()函式將字串轉化為整型數值,函式QString::toInt();有連個引數,第一個引數是一個bool型別的指標,用於返回轉換的狀態,當轉換成功時為true,第二個引數制定了轉換的基數,當基數為0時,將會使用C語言的轉換方法,如果字串以0X開頭則基數為16,其他情況下基數一律為10;
(2)字元編碼型別
QString 提供的字元編碼集的轉換函式將會返回一個const char*型別版本的QByteArray,即建構函式QByteArray(const char*)構造的QByteArray物件。QByteArray類具有一個位元組陣列,它既可以儲存原始位元組,也可以儲存傳統的以“\0”結尾的8位字串。在Qt中使用QByteArray比使用const char*更方便更方便而且支援隱式共享。
toAscii():返回一個ASCII編碼的8位字串
toLantin1():返回一個Lantin-1編碼的八位字串
toUtf8():返回一個UTF-8編碼的位字元
toLocal8Bit():返回一個系統本地編碼的8位字串
(tip:一個Null字串就是使用QString的預設建構函式或者是使用“(const char*)0”)作為引數的建構函式建立的QString字串。NULL字串一定為空字串而一個空字串未必是一個NULL字串。(inNULL(),isEmpty())
瞭解了QString的一些方法後,就可以開始計算器的實現了
4.計算器的介面設計
建立一個mainwindow檔案
QLabel:用於顯示數字
QPushButton:按鈕控制元件
VerticalLayout 垂直佈局
HorizontalLayout水平佈局
5.槽設計:
將每個按鈕轉到槽(右鍵->轉到槽)(注意每個按鈕的名字以方便操作)
轉到槽後
mainwindow。h
檔案中的部分函式:
5.將按鈕轉到槽後,在mainwindow.cpp中進行槽函式的實現
首先設定幾個變數來進行計算過程中的一些控制以及儲存:
bool isResult=false;//
bool Lock=false;//當每次使用了運算子或者使用計算結果的方法算出來一個數字時,鎖上backSpace的逐個刪除功能,作為清零使用避免惡意改變一些計算結果
bool hasCalculate=false;//是否所有的數字都已經被運算
QString a=“0”;//顯示欄上的數字
QString Result=“0”;//用來快取上一個數字
int op=-1;//用來儲存最新一個運算子的代號
除了“0”“00”以外的數字的槽函式(以1為例):
void MainWindow::on_num1_clicked()
{
if(Lock)Lock=false;//使用者輸入數字後即可以解除BackSpace的鎖定狀態
QString S=“1”;//字串為“1”,對應該數字
if(a!=“0”)
a+=S;//噹噹前的運算元不為零時,在末尾加上對應數字
else
a=S;//噹噹前運算元為0(即沒有別的數字輸入時),將其變為對應的數字
ui->display->setText(a);//將操作後的數字顯示在QLabel上
hasCalculate=false;//此時是有未被運算的數字的,取false
}
“0”和“00”
void MainWindow::on_num0_clicked()
{
if(Lock)
Lock=false;//解除BackSpace的鎖定狀態
QString S=“0”;
if(ui->display->text()!=“0”)//當顯示器上的運算元不為0時才響應,不然不作響應
{
if(a!=“0”)
{
a+=S;
ui->display->setText(a);//將0加到末尾
}
else
{
ui->display->setText(a);//a為0時直接將a顯示
}
}
hasCalculate=false;
}
基本的加減乘除乘方(二元運算子):
void MainWindow::on_divide_clicked()
{
if(isResult==false)
{
isResult=true;//當前數字並不是一個結果時
op=4;//除法代號為4,加減乘除乘方分別為12345
Result=a;//將第一個加數/被減數/第一個乘數/被除數/底數存入result中
a=“0”;//將第二個加數/減數/第二個乘數/除數/冪暫時設為0等待輸入
}
else
{
if(!hasCalculate)//當前面的數字沒有被計算時,為了避免設定太多的緩衝數,我們先呼叫一次等於
MainWindow::on_equal_clicked();
op=4;
}
}
等於號:
void MainWindow::on_equal_clicked()
{
if(op!=-1)
{
if(op==1)
{
double d1=Result。toDouble();
double d2=a。toDouble();
double d3=d1+d2;
QString S=QString::number(d3);
ui->display->setText(S);//計算後的結果顯示
Result=S;//將結果存入Result緩衝區以便於使用這個結果
a=“0”;//a歸為0
}
if(op==2)
{
double d1=Result。toDouble();
double d2=a。toDouble();
double d3=d1-d2;
QString S=QString::number(d3);
ui->display->setText(S);
Result=S;
a=“0”;
}
if(op==3)
{
double d1=Result。toDouble();
double d2=a。toDouble();
double d3=d1*d2;
QString S=QString::number(d3);
ui->display->setText(S);
Result=S;
a=“0”;
}
if(op==4)
{
double d1=Result。toDouble();
double d2=a。toDouble();
if(d2!=0)
{
double d3=d1/d2;
QString S=QString::number(d3);
ui->display->setText(S);
Result=S;
}
else
{
MainWindow::on_C_clicked();
ui->display->setText(“!”);//除數為0時進行報錯並清零
}
a=“0”;
}
if(op==5)
{
double d1=Result。toDouble();
int d2=a。toInt();
double d3=1。0;
if(d2!=0)
for(int i=1;i<=d2;i++)d3*=d1;
else d3=0;
QString S=QString::number(d3);
ui->display->setText(S);
Result=S;
a=“0”;
}
Lock=true;//鎖定結果的BackSpace操作
hasCalculate=true;
}
}
C全部清空操作,CE清除當前運算元操作,<-BackSpace操作
void MainWindow::on_C_clicked()
{
a=“0”;
Result=“0”;
Lock=false;
isResult=false;
hasCalculate=false;
op=-1;
ui->display->setText(a);//迴歸初始狀態
}
void MainWindow::on_CE_clicked()
{
a=“0”;
ui->display->setText(a);
if(Lock)
MainWindow::on_C_clicked();//如果是當前的顯示欄上本身就沒有運算元的,預設為清零
}
void MainWindow::on_Backspace_clicked()
{
if(!Lock)
{
QString S=ui->display->text();
a=S。left(S。length()-1);
if(a==“”||a==“-”)
a=“0”;
ui->display->setText(a);
}//當非鎖定時去掉最右邊,當為空或者符號負號時候,為0
else{
MainWindow::on_C_clicked();
}
}
+/-號操作:
void MainWindow::on_sign_clicked()
{
QString S=“-”;//先宣告一個“-”字串
if(a!=“0”)//不為0時進行符號操作
{
if(a。left(1)==“-”)
a。replace(QString(“-”), QString(“”));
else
{
a=S+a;
}
ui->display->setText(a);
}
}
小數點操作:
void MainWindow::on_spot_clicked()
{
if(a。indexOf(“。”)==-1)
{
QString S=“。”;
a+=S;
ui->display->setText(a);//當a中沒有。時,加上一個。
}
}
求平方,開根號,sin,cos等一元運算子,引入math。h後對顯示器上的數字進行操作即可
注:此計算器的%作為求百分數而不是求模
sin為例:
void MainWindow::on_sin_clicked()
{
double d=a。toDouble();
d=sin(d);
a=QString::number(d);
ui->display->setText(a);
Lock=true;
}