Qt學(xué)習(xí)
模擬登陸界面
- 登陸賬號(hào)密碼成功時(shí)輸出ok隙咸,否則error
void MainWindow::on_pushButton_clicked()
{
//qDebug()<<ui->linename->text()<<endl;
//qDebug()<<ui->linepwd->text()<<endl;
if((ui->linename->text()=="ssh123")&&(ui->linepwd->text()=="543859438"))
{
qDebug()<<"ok"<<endl;
}
else
{
qDebug()<<"error"<<endl;
}
}
void MainWindow::on_close_clicked()
{
close();
}
- 實(shí)際效果
Paste_Image.png
Paste_Image.png
將password的echo模式改為password即可實(shí)現(xiàn)密碼隱藏
Paste_Image.png
界面的objectname-MainWindow不可以修改检痰!
模擬信號(hào)和槽之間的連接機(jī)制
mainwindow.h
public slots:
void hello(int a);
signals:
void mySignal(int b);//定義一個(gè)信號(hào)
mainwindow.cpp
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this,SIGNAL(mySignal(int)),this,SLOT(hello(int)));//鏈接一般寫在構(gòu)造函數(shù)里
emit mySignal(1001);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::hello(int a)
{
qDebug()<<"hello a="<<a<<endl;
}
Paste_Image.png
信號(hào)與槽
- Qt中我們使用信號(hào)和槽可以替代回調(diào)的技術(shù)。
當(dāng)一個(gè)特定事件發(fā)生的時(shí)候理卑,一個(gè)信號(hào)被發(fā)射- Qt的窗口部件有很多預(yù)定義的信號(hào),但是我們總是可以通過繼承來加入我們自己的信號(hào)
- 槽就是一個(gè)可以被調(diào)用處理特定信號(hào)的函數(shù)
- Qt的窗口部件又很多預(yù)定義的槽步藕,但是通常的習(xí)慣是你可以加入自己的槽惦界,這樣你就可以處理你所感興趣的信號(hào)
- connect(src, SIGNAL(signature), dest, SLOT(signature));
- 簽名由函數(shù)名和參數(shù)類型組成。不允許有變量名或值咙冗。
- 信號(hào)可以發(fā)數(shù)據(jù)給槽沾歪,但參數(shù)類型要對(duì)應(yīng),
- 發(fā)出的數(shù)據(jù)可以多發(fā)少收雾消,但不能少發(fā)多收
- signal和slot機(jī)制
- 一個(gè)信號(hào)可以被連接到多個(gè)槽
connect(inputBox, SlGNAL(valueChanged(int)), staticBox,SLOT(setValue(int)));
connect(inputBox, SIGNAL(vaIueChanged(int)), okButton, SLOT(setTittIe(int))); - 多個(gè)信號(hào)可以被連接到一個(gè)槽
connect(doPlusBox, SIGNAL(overflow()), this, SLOT(mathError()));
connect(doMinusBox, SIGNAL(lessZero()), this灾搏,SLOT(mathError0)); - 一個(gè)信號(hào)可以被連接到另外一個(gè)信號(hào)〈信號(hào)轉(zhuǎn)發(fā)〉
connect(lineEdit, SIGNAL(textChanged()), this,SIGNAL(updateRecord()); - 連接可以隨時(shí)移除
disconnect(doPlusBox, SIGNAL(overflow()), this, SLOT(mathError()));
- 一個(gè)信號(hào)可以被連接到多個(gè)槽
使用系統(tǒng)默認(rèn)槽操作
Paste_Image.png
- 效果等同于使用slot按鍵關(guān)閉操作
Paste_Image.png
- 效果為按下按鈕按鈕消失
Paste_Image.png
Paste_Image.png
- 搞出下拉菜單
實(shí)現(xiàn)一個(gè)兩位數(shù)的計(jì)算器
圖形界面的設(shè)計(jì)如下:
Paste_Image.png
-
在mainwindow.h中:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_pushButton_3_clicked(); void on_pushButton_4_clicked(); void on_pushButton_5_clicked(); void on_pushButton_6_clicked(); void on_pushButton_7_clicked(); void on_pushButton_8_clicked(); void on_pushButton_9_clicked(); void on_pushButton_10_clicked(); void on_pushButton_11_clicked(); void on_pushButton_12_clicked(); void on_pushButton_13_clicked(); void on_pushButton_14_clicked(); void on_pushButton_15_clicked(); private: Ui::MainWindow *ui; int m_num1; int m_num2; int m_result; char m_op; int m_mark; }; #endif // MAINWINDOW_H
在mainwindow.cpp中:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_num1=0;
m_num2=0;
m_result=0;
m_op='+';
m_mark=0;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
if(m_mark==0)
{
m_num1=1;
}
else
{
m_num2=1;
}
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton->text());
}
void MainWindow::on_pushButton_2_clicked()
{
if(m_mark==0)
{
m_num1=2;
}
else
{
m_num2=2;
}
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_2->text());
}
void MainWindow::on_pushButton_3_clicked()
{
if(m_mark==0)
{
m_num1=3;
}
else
{
m_num2=3;
}
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_3->text());
}
void MainWindow::on_pushButton_4_clicked()
{
if(m_mark==0)
{
m_num1=4;
}
else
{
m_num2=4;
}
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_4->text());
}
void MainWindow::on_pushButton_5_clicked()
{
if(m_mark==0)
{
m_num1=5;
}
else
{
m_num2=5;
}
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_5->text());
}
void MainWindow::on_pushButton_6_clicked()
{
if(m_mark==0)
{
m_num1=6;
}
else
{
m_num2=6;
}
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_6->text());
}
void MainWindow::on_pushButton_7_clicked()
{
if(m_mark==0)
{
m_num1=7;
}
else
{
m_num2=7;
}
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_7->text());
}
void MainWindow::on_pushButton_8_clicked()
{
if(m_mark==0)
{
m_num1=8;
}
else
{
m_num2=8;
}
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_8->text());
}
void MainWindow::on_pushButton_9_clicked()
{
if(m_mark==0)
{
m_num1=9;
}
else
{
m_num2=9;
}
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_9->text());
}
void MainWindow::on_pushButton_10_clicked()
{
m_op='+';
m_mark=1;
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_10->text());
}
void MainWindow::on_pushButton_11_clicked()
{
m_op='-';
m_mark=1;
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_11->text());
}
void MainWindow::on_pushButton_12_clicked()
{
m_op='*';
m_mark=1;
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_12->text());
}
void MainWindow::on_pushButton_13_clicked()
{
m_op='/';
m_mark=1;
ui->lineEdit->setText(ui->lineEdit->text()+ui->pushButton_13->text());
}
void MainWindow::on_pushButton_14_clicked()
{
switch(m_op)
{
case '+':m_result=m_num1+m_num2;break;
case '-':m_result=m_num1-m_num2;break;
case '*':m_result=m_num1*m_num2;break;
case '/':m_result=m_num1/m_num2;break;
}
QString temp=QString::number(m_result,10);
temp=ui->lineEdit->text()+ui->pushButton_14->text()+temp;
ui->lineEdit->setText(temp);
m_num1=0;
m_num2=0;
m_result=0;
m_op='+';
m_mark=0;
}
void MainWindow::on_pushButton_15_clicked()
{
ui->lineEdit->clear();
}
- 運(yùn)行結(jié)果為:
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
firstui
- 學(xué)生信息管理系統(tǒng)
- styleSheet:可以修改文件的顏色和大小,顏色前面要加上color,不同應(yīng)用之間要用;隔開
Paste_Image.png
Paste_Image.png
輸入姓名與學(xué)號(hào)之后,點(diǎn)擊ok按鈕,則顯示出來,并且保存到文件里
- 在firstui.h中:
private slots:
void on_pushok_clicked();
- 在firstui.cpp中
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<endl;
}
- 則已在文件里保存了信息,如果student.txt前沒有加路勁,則默認(rèn)在別的路徑下,不好找,最好加路徑
Paste_Image.png
- 性別可分為男或者女,這樣就要弄可選擇的按鈕,即單選按鈕Radio Button
- 在firstui.cpp中
Paste_Image.png
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
QString sex=ui->sex->checkedButton()->text();//這里的sex是組名
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<endl;
}
- 單選按鈕man和female,我們可以把它們放在一個(gè)組里,如何選擇組,選中兩個(gè)單項(xiàng)按鈕,然后右擊,選擇第二項(xiàng),可以把組的名字改為sex.
- 結(jié)果為如下:
Paste_Image.png
- 年齡可以有很多個(gè)年齡,則就要用到復(fù)選框,combo Box
- 在firstui.cpp中
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
QString sex=ui->sex->checkedButton()->text();
QString age=ui->comboBox->currentText();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<" "<<age<<endl;
}
- 則運(yùn)行結(jié)果為,可以選擇適當(dāng)?shù)哪挲g:雙擊復(fù)選框,則進(jìn)入編輯,調(diào)價(jià)多個(gè)項(xiàng)
Paste_Image.png
Paste_Image.png
科目如上,與age相同
- 在firstui.cpp中
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
QString sex=ui->sex->checkedButton()->text();
QString age=ui->comboBox->currentText();
QString college=ui->comboBox_2->currentText();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<" "<<age<<" "<<college<<endl;
}
- 結(jié)果為如下:
Paste_Image.png
Paste_Image.png
興趣愛好,會(huì)有許多的興趣愛好,符合要求的都要勾上,則就要用到check Box
Paste_Image.png
- 如果要多選的話,則就要把右下角interset組的exclusive的勾去掉,即去掉互斥性
Paste_Image.png
- 則結(jié)果為:這里面用到了鏈表QList,則要包含頭文件
#include <QDebug>//要顯示line里面的內(nèi)容要加的
#include <QTextStream>
#include <QFile>//存到文件需要加的
#include <QList>
#include <QAbstractButton>
- 在firstui.cpp中:
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
QString sex=ui->sex->checkedButton()->text();
QString age=ui->comboBox->currentText();
QString college=ui->comboBox_2->currentText();
QList<QAbstractButton*>ins=ui->interset->buttons();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<" "<<age<<" "<<college;
for(int i=0;i<ins.size();i++)
{
if(ins[i]->isChecked())
{
out<<" "<<ins[i]->text();
}
}
out<<endl;
}
Paste_Image.png
在上一次輸入完成之后,清空里面的內(nèi)容
- 在firstui.cpp中:
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
QString sex=ui->sex->checkedButton()->text();
QString age=ui->comboBox->currentText();
QString college=ui->comboBox_2->currentText();
QList<QAbstractButton*>ins=ui->interset->buttons();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<" "<<age<<" "<<college;
for(int i=0;i<ins.size();i++)
{
if(ins[i]->isChecked())
{
out<<" "<<ins[i]->text();
ins[i]->setChecked(false);
}
}
out<<endl;
file.close();
ui->linename->clear();
ui->lineid->clear();
ui->comboBox->setCurrentIndex(0);
ui->comboBox_2->setCurrentIndex(0);
ui->sex->setExclusive(false);//
ui->sex->checkedButton()->setChecked(false);//
ui->sex->setExclusive(true);//這三句是清空sex的選項(xiàng)
}
void firstui::on_pushno_clicked()
{
close();
}
- 程序運(yùn)行之前
- 在程序運(yùn)行之后
Paste_Image.png
如果姓名想要兼容中文,則在main.cpp中
#include "firstui.h"
#include <QApplication>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec* codec=QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
firstui w;
w.show();
return a.exec();
}
- 能成功編譯過,并且能存入道文件中
Paste_Image.png