C/C++ Qt 基礎通用元件應用

lyshark發表於2021-11-23

QT 是一個跨平臺C++圖形介面開發庫,利用QT可以快速開發跨平臺窗體應用程式,在QT中我們可以通過拖拽的方式將不同元件放到指定的位置,實現圖形化開發極大的方便了開發效率。

目前,QT開發中常用的基礎元件有以下幾種:

  • PushButton 按鈕元件
  • LineEdit 單行輸入元件
  • SpinBox 數值元件
  • HorizontalSlider 滑塊條元件
  • LCDNumber 數碼錶與LCD螢幕
  • ComBox 下拉框元件
  • ProgressBar 進度條與定時器
  • DateTime 日期與時間元件
  • PlainTextEdit 多行文字框
  • RadioButton 單選框分組

如上方列表中提到的的元件,就是在開發中經常被使用的,這些元件我將通過一個個小案例,幫助大家理解元件的應用方式與應用場景。

PushButton 按鈕元件: 在QT中任何元件都可以用兩種建立方式,我們可以通過使用new關鍵字動態建立按鈕,也可以使用QT的圖形化工具自動生成。

首先我們通過命令列的方式生成幾個按鈕,匯入QPushButton包,然後定義如下程式碼,通過呼叫connect()可實現對特定按鈕賦予特定的函式事件。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <iostream>
#include <QPushButton>

// 設定函式,用於繫結事件
void Print()
{
    std::cout << "hello lyshark" << std::endl;
}

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 建立[退出]按鈕
    QPushButton * btn = new QPushButton;   // 建立一個按鈕
    // btn->show();                        // 用頂層方法彈出按鈕
    btn->setParent(this);                  // 設定父窗體(將btn內嵌到主窗體中)
    btn->setText("退出");                   // 設定按鈕text顯示
    btn->move(100,200);                    // 移動按鈕位置
    btn->resize(100,50);                   // 設定按鈕大小
    btn->setEnabled(true);                 // 設定是否可被點選

    // 建立[觸發訊號]按鈕
    QPushButton * btn2 = new QPushButton("觸發訊號",this);
    btn2->setParent(this);
    btn2->move(100,100);
    btn2->resize(100,50);

    // 設定主窗體常用屬性
    this->resize(500,400);            // 重置視窗大小,調整主視窗大小
    this->setWindowTitle("我的窗體");  // 重置主窗體的名字
    this->setFixedSize(1024,300);     // 固定窗體大小(不讓其修改)
    // this->showFullScreen();        // 設定窗體全屏顯示

    // 設定主窗體特殊屬性
    // setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); // 隱藏標題欄

    // 為按鈕繫結事件 connect(訊號的傳送者,傳送的訊號,訊號的接受者,處理的函式(槽函式))
    connect(btn,&QPushButton::clicked,this,&QWidget::close);

    // 將窗體中的 [觸發訊號] 按鈕,連線到Print函式中.
    connect(btn2,&QPushButton::clicked,this,&Print);
}

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::~MainWindow()
{
    delete ui;
}


LineEdit 單行輸入元件: 單行輸入框LineEdit()元件用來輸入一行文字內容,GroupBox()元件用來實現分組,QString類是String類的二次封裝版,通過兩者配合實現兩個簡單的數值轉換器。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <iostream>
#include <QString>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 設定計算和編輯框不可修改
    ui->NumberSum->setEnabled(false);
    ui->lineEdit_hex->setEnabled(false);
    ui->lineEdit_bin->setEnabled(false);

    // 設定為密碼輸入
    ui->NumberSum->setEchoMode(QLineEdit::Password);
}

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

// By : LyShark
// https://www.cnblogs.com/lyshark
// 當點選計算按鈕後完成計算
void MainWindow::on_pushButton_clicked()
{
    // 得到兩個編輯框的資料
    QString string_total;
    QString Number_One = ui->numberA->text();
    QString Number_Two = ui->NumberB->text();

    if(Number_One.length() == 0 || Number_Two.length() == 0)
    {
        ui->label_3->setText("引數不能為空");
    }
    else
    {
        // 型別轉換並賦值
        int number_int = Number_One.toInt();
        float number_float = Number_Two.toFloat();

        // 計算結果並放入到第三個編輯框中
        float total = number_int * number_float;

        string_total = string_total.sprintf("%.2f",total);
        ui->NumberSum->setText(string_total);
    }
}

// 當點選進位制轉換按鈕後觸發事件
void MainWindow::on_pushButton_2_clicked()
{
    QString str = ui->lineEdit->text();
    int value = str.toUInt();

    // 轉十六進位制
    str = str.setNum(value,16);     // 轉為16進位制
    str = str.toUpper();            // 變為大寫
    ui->lineEdit_hex->setText(str); // 設定hex編輯框

    // 轉二進位制
    str = str.setNum(value,2);        // 第一種方式轉換
    str = QString::number(value,2);   // 第二種方式轉換
    ui->lineEdit_bin->setText(str);   // 設定bin編輯框
}

如上我們學習總結了按鈕元件與編輯框元件的使用,這兩個元件組合起來可實現一個簡單地頁面登入驗證介面,程式碼如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QMessageBox>
#include <QByteArray>
#include <QSettings>
#include <QCryptographicHash>

QString m_user="admin";   // 初始化使用者名稱
QString m_pswd="12345";   // 初始化密碼
int m_tryCount=0;         // 試錯次數

// 字串MD5演算法加密
QString MainWindow::encrypt(const QString &str)
{
    QByteArray btArray;
    btArray.append(str);                               // 加入原始字串
    QCryptographicHash hash(QCryptographicHash::Md5);  // Md5加密演算法

    hash.addData(btArray);                             // 新增資料到加密雜湊值
    QByteArray resultArray =hash.result();             // 返回最終的雜湊值
    QString md5 =resultArray.toHex();                  // 轉換為16進位制字串
    return  md5;
}

// 讀取使用者名稱密碼
void MainWindow::ReadString()
{
    QString organization="UserDataBase";           // 登錄檔
    QString appName="onley";                       // HKEY_CURRENT_USER/Software/UserDataBase/onley
    QSettings settings(organization,appName);      // 建立key-value

    bool saved=settings.value("saved",false).toBool();       // 讀取 saved鍵的值
    m_user=settings.value("Username", "admin").toString();   // 讀取 Username 鍵的值,預設為admin
    QString defaultPSWD=encrypt("12345");                    // 預設密碼 12345 加密後的資料
    m_pswd=settings.value("PSWD",defaultPSWD).toString();    // 讀取PSWD鍵的值

    if (saved)
    {
        ui->lineEdit_Username->setText(m_user);
    }
    ui->checkBox->setChecked(saved);
}

// 儲存使用者名稱密碼設定
void MainWindow::WriteString()
{
    QSettings settings("UserDataBase","onley"); // 登錄檔鍵組
    settings.setValue("Username",m_user);       // 使用者名稱
    settings.setValue("PSWD",m_pswd);           // 經過加密的密碼
    settings.setValue("saved",ui->checkBox->isChecked());
}

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setFixedSize(this->width(), this->height());             // 視窗不可調節
    ui->lineEdit_Password->setEchoMode(QLineEdit::Password); // 密碼輸入
    ReadString();
}

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

// login
void MainWindow::on_pushButton_clicked()
{
    QString user=ui->lineEdit_Username->text().trimmed();//輸入使用者名稱
    QString pswd=ui->lineEdit_Password->text().trimmed(); //輸入密碼

    QString encrptPSWD=encrypt(pswd); //對輸入密碼進行加密

    if ((user==m_user)&&(encrptPSWD==m_pswd)) //如果使用者名稱和密碼正確
    {
        WriteString();
        QMessageBox::critical(this,"成功","已登入");
    }
    else
    {
        m_tryCount++; //錯誤次數
        if (m_tryCount>3)
        {
            QMessageBox::critical(this, "錯誤", "輸入錯誤次數太多,強行退出");
            this->close();
        }
        else
        {
            QMessageBox::warning(this, "錯誤提示", "使用者名稱或密碼錯誤");
        }

    }
}


SpinBox 數值元件: 該控制元件主要用於整數或浮點數的計數顯示,與普通的LineEdit不同,該元件可以在前後增加特殊符號並提供了上下幅度的調整按鈕,靈活性更強。

該元件有兩個版本,SpinBox()用於顯示整數與單精度浮點數,DoubleSpinBox()則是雙精度浮點數,SpinBox有兩個特殊引數,prefix引數是在前方加入特殊符號,而suffix則是在後方加入特殊符號。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <iostream>
#include <QString>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->doubleSpinBox->setEnabled(false);
}

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

// By : LyShark
// https://www.cnblogs.com/lyshark
// 實現精度計算功能
void MainWindow::on_pushButton_3_clicked()
{
    int x = ui->spinBox->value();
    int y = ui->spinBox_2->value();

    double total = x+y;
    ui->doubleSpinBox->setValue(total);   // 設定SpinBox數值(設定時無需轉換)

    QString label_value = ui->label_10->text();  // 獲取字串
    ui->label_10->setNum(total);                 // 設定label標籤為數字
}

我們繼續在SpinBox的基礎上改進,如上程式碼中每次都需要點選計算按鈕才能出結果,此時我們需求是實現當SpinBox中的引數發生變化時自定的完成計算,這裡就需要用到訊號和槽了,當SpinBox被修改後,自動觸發計算訊號實現計算。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <iostream>
#include <QString>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->doubleSpinBox->setEnabled(false);

    // 將數量和單價兩個SpinBox的valueChanged()訊號與on_pushButton_clicked()槽關聯
    // 只要spinBox中的內容發生變化,則立即觸發按鈕完成計算
    QObject::connect(ui->spinBox,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));
    QObject::connect(ui->spinBox_2,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));
    QObject::connect(ui->doubleSpinBox,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));
}

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::~MainWindow()
{
    delete ui;
}

// 實現精度計算功能
void MainWindow::on_pushButton_clicked()
{
    int x = ui->spinBox->value();
    int y = ui->spinBox_2->value();

    double total = x+y;
    ui->doubleSpinBox->setValue(total);   // 設定SpinBox數值(設定時無需轉換)

    QString label_value = ui->label_10->text();  // 獲取字串
    ui->label_10->setNum(total);                 // 設定label標籤為數字
}


HorizontalSlider 滑塊條元件: 根據上面的SpinBox訊號與槽函式的繫結,我們還可以將其繫結到滑塊條元件上,如下程式碼實現了,當使用者改變滑塊條時,右側的textEdit的顏色也會發生相應的改變。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <iostream>
#include <QString>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // ----------------------------------------------------------------------------------
    // 將 SliderGreen,SliderBlue,SliderAlpha 與第一個滑塊條 SliderRead 關聯起來
    // 實現效果為,當其他三個選擇條數值改變時,同樣會觸發on_SliderRed_valueChanged槽函式
    QObject::connect(ui->SliderRed,SIGNAL(valueChanged(int)),this,SLOT(on_SliderRed_valueChanged(int)));
    QObject::connect(ui->SliderGreen,SIGNAL(valueChanged(int)),this,SLOT(on_SliderRed_valueChanged(int)));
    QObject::connect(ui->SliderBlue,SIGNAL(valueChanged(int)),this,SLOT(on_SliderRed_valueChanged(int)));
    QObject::connect(ui->SliderAlpha,SIGNAL(valueChanged(int)),this,SLOT(on_SliderRed_valueChanged(int)));
}

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

// By : LyShark
// https://www.cnblogs.com/lyshark
// 當拖動SliderRed滑塊條時設定TextEdit底色
void MainWindow::on_SliderRed_valueChanged(int value)
{
    Q_UNUSED(value);
    QColor  color;
    int R=ui->SliderRed->value();      // 讀取SliderRed的當前值
    int G=ui->SliderGreen->value();    // 讀取 SliderGreen 的當前值
    int B=ui->SliderBlue->value();     // 讀取 SliderBlue 的當前值
    int alpha=ui->SliderAlpha->value();// 讀取 SliderAlpha 的當前值
    color.setRgb(R,G,B,alpha);         // 使用QColor的setRgb()函式獲得顏色

    QPalette pal=ui->textEdit->palette(); // 獲取textEdit原有的 palette
    pal.setColor(QPalette::Base,color);   // 設定palette的基色(即背景色)
    ui->textEdit->setPalette(pal);        // 設定為textEdit的palette,改變textEdit的底色
}


數碼錶與LCD螢幕: 這是兩個比較有趣的元件,如下佈局中圓形的是dial元件,其右側則是一個LCD Number元件,兩者可以靈活的結合在一起使用,當撥動齒輪時自動影響LCD數碼螢幕的顯示。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <iostream>
#include <QString>
#include <QPushButton>
#include <QRadioButton>

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::~MainWindow()
{
    delete ui;
}


// 當圓形選擇框數值改變時設定數碼錶顯示
void MainWindow::on_dial_valueChanged(int value)
{
   ui->LCDDisplay->display(value);
}


// 選中時設定為十進位制顯示
void MainWindow::on_radioBtnDec_clicked()
{
    ui->LCDDisplay->setDigitCount(3);   // 設定位數
    ui->LCDDisplay->setDecMode();       // 十進位制
}


// 選中設定為二進位制顯示
void MainWindow::on_radioBtnBin_clicked()
{
    ui->LCDDisplay->setDigitCount(8);
    ui->LCDDisplay->setBinMode();
}


// 選中設定為八進位制顯示
void MainWindow::on_radioBtnOct_clicked()
{
    ui->LCDDisplay->setDigitCount(5);
    ui->LCDDisplay->setOctMode();
}


// 選中設定為十六進位制顯示
void MainWindow::on_radioBtnHex_clicked()
{
    ui->LCDDisplay->setDigitCount(3);
    ui->LCDDisplay->setHexMode();
}


CheckBox 多選框: 多選框CheckBox元件也是最常用的元件,多選框支援三態選擇,選中半選中和未選中狀態。

#include "mainwindow.h"
#include "ui_mainwindow.h"

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->checkBox->setTristate();       // 啟用三態選擇框
    ui->checkBox->setEnabled(true);    // 設定為可選狀態
}

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

// 三態選擇框狀態
void MainWindow::on_checkBox_stateChanged(int state)
{
    // 選中狀態
    if (state == Qt::Checked)
    {
       ui->checkBox->setText("選中");
    }
    // 半選狀態
    else if(state == Qt::PartiallyChecked)
    {
       ui->checkBox->setText("半選");
    }
    // 未選中
    else
    {
       ui->checkBox->setText("未選中");
    }
}

// 設定取消選中
void MainWindow::on_pushButton_clicked()
{
    int check = ui->checkBox->isCheckable();
    if(check == 1)
    {
        ui->checkBox->setChecked(false);
    }
}

// 關聯式多選框
void MainWindow::on_checkBox_master_stateChanged(int state)
{
    // 選中所有子框
    if(state == Qt::Checked)
    {
        ui->checkBox_sub_a->setChecked(true);
        ui->checkBox_sub_b->setChecked(true);
    }
    // 取消子框全選狀態
    if(state == Qt::Unchecked)
    {
        ui->checkBox_sub_a->setChecked(false);
        ui->checkBox_sub_b->setChecked(false);
    }
}


ComBox 下拉框元件: 該元件提供了下拉選單供使用者選擇,ComBox元件除了可以顯示下拉選單外,每個項還可以關聯一個QVariant型別的變數用於儲存不可見資料。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <iostream>
#include <QList>
#include <QMap>

// 定義為全域性變數
QMap<QString,int> City_Zone;
QMap<QString,QList <QString>> map;
QList<QString> tmp;

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // -----------------------------------------------------------------
    // 迴圈方式新增元素
    ui->comboBox_main->clear();
    QIcon icon;
    icon.addFile(":/image/1.ico");
    for(int x=0;x<10;x++)
    {
        ui->comboBox_main->addItem(icon,QString::asprintf("元素_%d",x));
    }

    // -----------------------------------------------------------------
    // 批量新增combox元素
    ui->comboBox_main->clear();
    QStringList str;
    str << "北京" << "上海" << "廣州";

    ui->comboBox_main->addItems(str);
    ui->comboBox_main->setItemIcon(0,QIcon(":/image/1.ico"));
    ui->comboBox_main->setItemIcon(1,QIcon(":/image/2.ico"));
    ui->comboBox_main->setItemIcon(2,QIcon(":/image/3.ico"));

    // -----------------------------------------------------------------
    // 實現combox聯動效果
    ui->comboBox_main->clear();
    City_Zone.insert("請選擇",0);
    City_Zone.insert("北京",1);
    City_Zone.insert("上海",2);
    City_Zone.insert("廣州",3);

    // 迴圈填充一級選單
    ui->comboBox_main->clear();
    foreach(const QString &str,City_Zone.keys())
    {
        ui->comboBox_main->addItem(QIcon(":/image/1.ico"),str,City_Zone.value(str));
    }

    // -----------------------------------------------------------------
    // 插入二級選單
    tmp.clear();
    tmp << "大興區" << "昌平區" << "東城區";
    map["北京"] = tmp;

    tmp.clear();
    tmp << "黃浦區" << "徐彙區" << "長寧區" << "楊浦區";
    map["上海"] = tmp;

    tmp.clear();
    tmp << "荔灣區" << "越秀區";
    map["廣州"] = tmp;

    // 設定預設選擇第三個
    ui->comboBox_main->setCurrentIndex(3);
}

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

// 獲取當前選中的兩級選單內容
void MainWindow::on_pushButton_clicked()
{
    QString one = ui->comboBox_main->currentText();
    QString two = ui->comboBox_submain->currentText();
    std::cout << one.toStdString().data() << " | " << two.toStdString().data() << std::endl;
}

// 當主ComBox被選擇時,自動的填充第2個ComBox中的資料.
void MainWindow::on_comboBox_main_currentTextChanged(const QString &arg1)
{
    ui->comboBox_submain->clear();
    QList<QString> qtmp;

    qtmp = map.value(arg1);
    for(int x=0;x<qtmp.count();x++)
    {
        ui->comboBox_submain->addItem(QIcon(":/image/2.ico"),qtmp[x]);
    }
}


ProgressBar 進度條與定時器: 進度條ProgressBar元件通常會結合QTimer定時器元件共同使用,首先我們需要設定一個時鐘週期,定時器每經過一定的時間週期則執行對變數或進度條的遞增操作,由此實現進度條動態輸出效果。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>

QTimer *my_timer;

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 初始化進度條數值
    ui->progressBar->setValue(0);
    ui->progressBar_2->setValue(100);


    // 宣告定時器
    my_timer = new QTimer(this);

    // 繫結一個匿名函式
    connect(my_timer,&QTimer::timeout,[=]{
        static int x = 0;

        // 判斷是否到達了進度條的最大值
        if(x != 100)
        {
            x++;
            ui->progressBar->setValue(x);
            ui->progressBar_2->setValue(int(100-x));
        }
        else
        {
            x=0;
            my_timer->stop();
        }
    });
}

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

// 啟動定時器,並設定週期為100毫秒
void MainWindow::on_pushButton_clicked()
{
    if(my_timer->isActive() == false)
    {
        my_timer->start(100);
    }
}

// 停止定時器
void MainWindow::on_pushButton_2_clicked()
{
    if(my_timer->isActive() == true)
    {
        my_timer->stop();
    }
}

// 將進度條置空
void MainWindow::on_pushButton_3_clicked()
{
    ui->progressBar->setValue(0);
    ui->progressBar_2->setValue(100);
}


DateTime 日期與時間元件: 時間元件中包括了可以顯示時間的QTime顯示日期的QDate以及可同時顯示時間與日期的QDateTime這三種元件,三種元件的使用上幾乎一致,如下程式碼是開發中最常用的總結。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDateTime>

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

// By : LyShark

// https://www.cnblogs.com/lyshark
MainWindow::~MainWindow()
{
    delete ui;
}

// 獲取當前日期時間,並初始化到元件中
void MainWindow::on_pushButton_clicked()
{
     QDateTime curDateTime = QDateTime::currentDateTime();

     ui->timeEdit->setTime(curDateTime.time());
     ui->dateEdit->setDate(curDateTime.date());
     ui->dateTimeEdit->setDateTime(curDateTime);

     ui->lineEdit->setText(curDateTime.toString("yyyy-MM-dd hh:mm:ss"));
}

// 將字串時間日期轉換到時間日期元件中
void MainWindow::on_pushButton_2_clicked()
{
    QString str = ui->lineEdit_2->text();
    str = str.trimmed();
    if(!str.isEmpty())
    {
        QDateTime datetime = QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss");
        ui->dateTimeEdit_string_to_datetime->setDateTime(datetime);
    }
}


PlainTextEdit 多行文字框: 多行文字編輯器,用於顯示和編輯多行簡單文字,如下程式碼左側PlainTextEdit中輸入資料(每行換行)點選按鈕後自動將左側資料放入右側的listView元件中。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QLabel>
#include <QTextBlock>
#include <iostream>
#include <QStringListModel>

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 狀態列的建立
    QStatusBar * stBar = statusBar();
    setStatusBar(stBar);

    QLabel * label = new QLabel("左側提示資訊",this);
    stBar->addWidget(label);

    QLabel * label2 = new QLabel("右側提示資訊",this);
    stBar->addPermanentWidget(label2);
}

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

// 點選按鈕實現將 plainTextEdit 裡面的資料逐行放入到右側
void MainWindow::on_pushButton_clicked()
{
    QTextDocument* doc = ui->plainTextEdit->document ();  // 文字物件
    int count = doc->blockCount();                        // 定義回車為分隔符

    // 定義data,model用於儲存每個文字
    QStringList data;
    QStringListModel *model;

    for(int x=0;x< count;x++)
    {
        QTextBlock textLine = doc->findBlockByNumber(x); // 每次取出plainTextEdit中的一行
        QString str = textLine.text();
        data << str;                                     // 放入連結串列中
    }

    // 顯示到ListView中
    model = new QStringListModel(data);
    ui->listView->setModel(model);
}


RadioButton 單選框分組: 單選框是最常用的元件,在一個介面中可以有多種單選框,每種單選框都會對應一個問題,此實我們需要使用ButtonGroup元件對單選框進行分組,並通過訊號和槽函式相互繫結,從而實現對使用者的多種選擇進行判斷。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QButtonGroup>
#include <iostream>

QButtonGroup *group_sex;
QButtonGroup *group_hobby;

// By : LyShark
// https://www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 將不同的RadioButton放入不同的ButtonGroup組中
    group_sex = new QButtonGroup(this);
    group_sex->addButton(ui->radioButton_male,0);
    group_sex->addButton(ui->radioButton_female,1);
    group_sex->addButton(ui->radioButton_unknown,2);
    ui->radioButton_unknown->setChecked(true);

    group_hobby = new QButtonGroup(this);
    group_hobby->addButton(ui->radioButton_eat,3);
    group_hobby->addButton(ui->radioButton_drink,4);
    group_hobby->addButton(ui->radioButton_sleep,5);
    ui->radioButton_eat->setChecked(true);

    // 繫結訊號和槽
    connect(ui->radioButton_male,SIGNAL(clicked(bool)),this,SLOT(MySlots()));
    connect(ui->radioButton_female,SIGNAL(clicked(bool)),this,SLOT(MySlots()));
    connect(ui->radioButton_unknown,SIGNAL(clicked(bool)),this,SLOT(MySlots()));
}

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

// 手動建立一個槽函式,此處的槽函式宣告需要加入到標頭檔案private slots中
void MainWindow::MySlots()
{
    switch(group_sex->checkedId())
    {
    case 0:
        std::cout << "male" << std::endl;
        break;
    case 1:
        std::cout << "female" << std::endl;
        break;
    case 2:
        std::cout << "unknown" << std::endl;
        break;
    }
}

相關文章