Qt學習-(基本按鈕功能實現)

Qt學習

模擬登陸界面

  • 登陸賬號密碼成功時輸出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();
}
  • 實際效果
Paste_Image.png
Paste_Image.png

將password的echo模式改為password即可實現密碼隱藏

Paste_Image.png

界面的objectname-MainWindow不可以修改!

模擬信號和槽之間的連接機制

mainwindow.h

public slots:
    void hello(int a);
signals:
    void mySignal(int b);//定義一個信號

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)));//鏈接一般寫在構造函數里
    emit mySignal(1001);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::hello(int a)
{
    qDebug()<<"hello a="<<a<<endl;
}
Paste_Image.png

信號與槽

  • Qt中我們使用信號和槽可以替代回調的技術。
    當一個特定事件發生的時候,一個信號被發射
    • Qt的窗口部件有很多預定義的信號,但是我們總是可以通過繼承來加入我們自己的信號
    • 槽就是一個可以被調用處理特定信號的函數
    • Qt的窗口部件又很多預定義的槽,但是通常的習慣是你可以加入自己的槽,這樣你就可以處理你所感興趣的信號
  • connect(src, SIGNAL(signature), dest, SLOT(signature));
    • 簽名由函數名和參數類型組成。不允許有變量名或值。
    • 信號可以發數據給槽,但參數類型要對應,
    • 發出的數據可以多發少收,但不能少發多收
  • signal和slot機制
    • 一個信號可以被連接到多個槽
      connect(inputBox, SlGNAL(valueChanged(int)), staticBox,SLOT(setValue(int)));
      connect(inputBox, SIGNAL(vaIueChanged(int)), okButton, SLOT(setTittIe(int)));
    • 多個信號可以被連接到一個槽
      connect(doPlusBox, SIGNAL(overflow()), this, SLOT(mathError()));
      connect(doMinusBox, SIGNAL(lessZero()), this,SLOT(mathError0));
    • 一個信號可以被連接到另外一個信號〈信號轉發〉
      connect(lineEdit, SIGNAL(textChanged()), this,SIGNAL(updateRecord());
    • 連接可以隨時移除
      disconnect(doPlusBox, SIGNAL(overflow()), this, SLOT(mathError()));

使用系統默認槽操作

Paste_Image.png
  • 效果等同于使用slot按鍵關閉操作
Paste_Image.png
  • 效果為按下按鈕按鈕消失
Paste_Image.png
Paste_Image.png
  • 搞出下拉菜單

實現一個兩位數的計算器

  • 圖形界面的設計如下:


    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();
}
  • 運行結果為:
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png

firstui

  • 學生信息管理系統
  • styleSheet:可以修改文件的顏色和大小,顏色前面要加上color,不同應用之間要用;隔開
Paste_Image.png
Paste_Image.png

輸入姓名與學號之后,點擊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前沒有加路勁,則默認在別的路徑下,不好找,最好加路徑
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,我們可以把它們放在一個組里,如何選擇組,選中兩個單項按鈕,然后右擊,選擇第二項,可以把組的名字改為sex.
  • 結果為如下:
Paste_Image.png
  • 年齡可以有很多個年齡,則就要用到復選框,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;
}

  • 則運行結果為,可以選擇適當的年齡:雙擊復選框,則進入編輯,調價多個項
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;
}

  • 結果為如下:
Paste_Image.png
Paste_Image.png

興趣愛好,會有許多的興趣愛好,符合要求的都要勾上,則就要用到check Box

Paste_Image.png
  • 如果要多選的話,則就要把右下角interset組的exclusive的勾去掉,即去掉互斥性
Paste_Image.png
  • 則結果為:這里面用到了鏈表QList,則要包含頭文件
#include <QDebug>//要顯示line里面的內容要加的
#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

在上一次輸入完成之后,清空里面的內容

  • 在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的選項
}
void firstui::on_pushno_clicked()
{
    close();
}

  • 程序運行之前
  • 在程序運行之后
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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉自:作者簡介作者:唐新華 (xhsmart@263.net)軟件工程師 ?? 信號和槽作為QT的核心機制在QT編...
    njukay閱讀 1,365評論 0 49
  • Qt學習 Qt是什么 Qt是一個跨平臺的C++圖形用戶界面庫,通過變以來跨平臺,實現一個Qt支持Unix,Linu...
    I踏雪尋梅閱讀 2,787評論 0 14
  • QT5實現音樂播放器是十分簡單的,因為內部已經封裝好了 QMediaPlayer 和 QMediaPlaylist...
    QingLinger閱讀 5,390評論 0 0
  • Qt學習 事件:事件在Qt分很多種,例如鼠標,鍵盤,定時器,窗體大小,任何動作在GUI都可以觸發某種事件, 根據C...
    I踏雪尋梅閱讀 2,630評論 0 1
  • 每個人都有屬于自己的一段路,你不知道接下來會發生什么,會改變什么,但即使這段路程再迷茫,再彷徨,沒有人會幫助你,或...
    路憶閱讀 356評論 0 0