Qt學(xué)習(xí)-(基本按鈕功能實(shí)現(xiàn))

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()));

使用系統(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自:作者簡介作者:唐新華 (xhsmart@263.net)軟件工程師 ?? 信號(hào)和槽作為QT的核心機(jī)制在QT編...
    njukay閱讀 1,415評(píng)論 0 49
  • Qt學(xué)習(xí) Qt是什么 Qt是一個(gè)跨平臺(tái)的C++圖形用戶界面庫,通過變以來跨平臺(tái),實(shí)現(xiàn)一個(gè)Qt支持Unix,Linu...
    I踏雪尋梅閱讀 3,014評(píng)論 0 14
  • QT5實(shí)現(xiàn)音樂播放器是十分簡單的,因?yàn)閮?nèi)部已經(jīng)封裝好了 QMediaPlayer 和 QMediaPlaylist...
    QingLinger閱讀 5,423評(píng)論 0 0
  • Qt學(xué)習(xí) 事件:事件在Qt分很多種,例如鼠標(biāo),鍵盤,定時(shí)器,窗體大小,任何動(dòng)作在GUI都可以觸發(fā)某種事件, 根據(jù)C...
    I踏雪尋梅閱讀 2,726評(píng)論 0 1
  • 每個(gè)人都有屬于自己的一段路,你不知道接下來會(huì)發(fā)生什么,會(huì)改變什么,但即使這段路程再迷茫,再彷徨,沒有人會(huì)幫助你,或...
    路憶閱讀 393評(píng)論 0 0

友情鏈接更多精彩內(nèi)容