C/C++ Qt 基礎通用組件應用
- 2021 年 11 月 23 日
- 筆記
- C/C++ Qt 圖形化開發
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
// //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
// //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
// //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
// //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
// //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
// //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
// //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
// //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
// //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
// //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
// //www.cnblogs.com/lyshark
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
// By : LyShark
// //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
// //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
// //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;
}
}