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;
}
}