1. 實例簡介
Qt 中用于項 (Item)處理的組件有兩類,一類是 Item Views,包括 QListView、QTreeView、QTableView、QColumnView 等;另一類是 Item Widgets,包括 QListWidget、QTreeWidget 和QTableWidget。
Item Views 基于模型/視圖(Model/Vicw)結構,視圖 (View)與模型數(shù)據(jù)(Model Data)關聯(lián)實現(xiàn)數(shù)據(jù)的顯示和編輯,模型/視圖結構的使用在第5 章詳細介紹。Item Widgets
是直接將數(shù)據(jù)存儲在每一個項里,例如,QListWidget 的每一行是一個項,QTreeWidget 的每個節(jié)點是一個項,QTableWidget 的每一個單元格是一個項。一個項存儲了文字文字的格式、自定義數(shù)據(jù)等。
Item Widgets 是GUI 設計中常用的組件,本節(jié)通過實例 samp4_7 先介紹 QListWidget 以及其他一些組件的用法,實例運行時界面如圖 4-8 所示。
本實例不僅介紹QListWidget 的使用,還包括如下一些功能的實現(xiàn)。
- 使用QTabWidget 設計多頁界面,工作區(qū)右側就是一個具有 3 個頁面的 TabWidget 組件。
- 使用QToolBox 設計多組工具箱,工作區(qū)左側是一個有 3 個組的 TolBox 組件。
- 使用分隔條(QSplitter) 設計可以左右分割的界面,工作區(qū)的 TolBox 和 TabWidget 之間有一個 splitter,運行時可以分割調(diào)整兩個組件的大小。
- 創(chuàng)建Actions,用Actions 設計主工具欄,用Action 關聯(lián) QToolButton 按鈕。
- 使用 QToolButton 按鈕,設置與 Action 關聯(lián),設計具有下拉菜單功能的 ToolButton 按鈕在主工具欄上添加具有下拉菜單的 ToolButton 按鈕。
- 使用 QListWidget,演示如何創(chuàng)建和添加項,為項設置圖標和復選框,如何遍歷列表進行選擇。
- QListWidget的主要信號currentItemChanged()的功能,編寫響應槽函數(shù)。
- 為QListWidget 組件利用已設計的 Actions 創(chuàng)建自定義快捷菜單。
關于上述提到詳細的請參考源碼及書籍文章來源:http://www.zghlxwxcb.cn/news/detail-639031.html
2. 源碼
2.1 混合式界面設計
文章來源地址http://www.zghlxwxcb.cn/news/detail-639031.html
2.2 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QListWidgetItem>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
void setActionsForButton();
void createSelectionPopMenu();
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_actListClear_triggered(); //清除項
void on_actListIni_triggered(); //項初始化
void on_chkBoxListEditable_clicked(bool checked); //chkBoxListEditable單擊事件
//當前選擇項發(fā)生變化
void on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
void on_actListInsert_triggered(); //插入項
void on_actListAppend_triggered(); //添加項
void on_actListDelete_triggered(); //刪除當前項
void on_listWidget_customContextMenuRequested(const QPoint &pos); //彈出菜單
void on_toolBox_currentChanged(int index); //ToolBox當前組變化時,顯示TabWidget相應的頁面
void on_actSelALL_triggered(); //全選
void on_actSelNone_triggered();//全不選
void on_actSelInvs_triggered();//反選
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
2.3 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenu>
void MainWindow::setActionsForButton()
{//為QToolButton按鈕設置Action
ui->tBtnListIni->setDefaultAction(ui->actListIni);
ui->tBtnListClear->setDefaultAction(ui->actListClear);
ui->tBtnListInsert->setDefaultAction(ui->actListInsert);
ui->tBtnListAppend->setDefaultAction(ui->actListAppend);
ui->tBtnListDelete->setDefaultAction(ui->actListDelete);
ui->tBtnSelALL->setDefaultAction(ui->actSelALL);
ui->tBtnSelNone->setDefaultAction(ui->actSelNone);
ui->tBtnSelInvs->setDefaultAction(ui->actSelInvs);
}
void MainWindow::createSelectionPopMenu()
{
//創(chuàng)建下拉菜單
QMenu* menuSelection=new QMenu(this); //創(chuàng)建選擇彈出式菜單
menuSelection->addAction(ui->actSelALL);
menuSelection->addAction(ui->actSelNone);
menuSelection->addAction(ui->actSelInvs);
//listWidget上方的tBtnSelectItem按鈕
ui->tBtnSelectItem->setPopupMode(QToolButton::MenuButtonPopup);//菜單彈出模式,執(zhí)行按鈕的Action
ui->tBtnSelectItem->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); //按鈕樣式
ui->tBtnSelectItem->setDefaultAction(ui->actSelPopMenu);//關聯(lián)Action
ui->tBtnSelectItem->setMenu(menuSelection); //設置下拉菜單
//工具欄上的 下拉式菜單按鈕
QToolButton *aBtn=new QToolButton(this);
aBtn->setPopupMode(QToolButton::InstantPopup);//button's own action is not triggered.
aBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);//按鈕樣式
aBtn->setDefaultAction(ui->actSelPopMenu); //設置Action,獲取圖標、標題等設置
aBtn->setMenu(menuSelection);//設置下拉菜單
ui->mainToolBar->addWidget(aBtn); //工具欄添加按鈕
//工具欄添加分隔條,和“退出”按鈕
ui->mainToolBar->addSeparator();
ui->mainToolBar->addAction(ui->actQuit);
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setCentralWidget(ui->splitter); //設置中心組件
setActionsForButton();
createSelectionPopMenu();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_actListClear_triggered()
{
ui->listWidget->clear(); //清除項
}
void MainWindow::on_actListIni_triggered()
{ //初始化項
QListWidgetItem *aItem; //每一行是一個QListWidgetItem
QIcon aIcon;
aIcon.addFile(":/images/icons/check2.ico"); //設置ICON的圖標
bool chk=ui->chkBoxListEditable->isChecked();//是否可編輯
ui->listWidget->clear(); //清除項
for (int i=0; i<10; i++)
{
QString str=QString::asprintf("Item %d",i);
aItem=new QListWidgetItem(); //新建一個項
aItem->setText(str); //設置文字標簽
aItem->setIcon(aIcon);//設置圖標
aItem->setCheckState(Qt::Checked); //設置為選中狀態(tài)
if (chk) //可編輯, 設置flags
aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
else//不可編輯, 設置flags
aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
ui->listWidget->addItem(aItem); //增加一個項
}
}
void MainWindow::on_chkBoxListEditable_clicked(bool checked)
{ //可編輯 QCheckBox的響應代碼, 設置所有項是否可編輯
int i,cnt;
QListWidgetItem *aItem;
cnt=ui->listWidget->count();//項的個數(shù)
for (i=0; i<cnt; i++)
{
aItem=ui->listWidget->item(i);//獲得一個項
if (checked) //可編輯
aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
else
aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
}
}
void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{ //listWidget當前選中項發(fā)生變化
QString str;
if (current != NULL) //需要檢測變量指針是否為空
{
if (previous==NULL) //需要檢測變量指針是否為空
str="當前:"+current->text();
else
str="前一項:"+previous->text()+"; 當前項:"+current->text();
ui->editCutItemText->setText(str);
}
}
void MainWindow::on_actListInsert_triggered()
{ //插入一個項
QIcon aIcon;
aIcon.addFile(":/images/icons/check2.ico"); //圖標
bool chk=ui->chkBoxListEditable->isChecked(); //是否可比那幾
QListWidgetItem* aItem=new QListWidgetItem("New Inserted Item"); //創(chuàng)建一個項
aItem->setIcon(aIcon);//設置圖標
aItem->setCheckState(Qt::Checked); //設置為checked
if (chk) //設置標記
aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
else
aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
ui->listWidget->insertItem(ui->listWidget->currentRow(),aItem); //在當前行的上方插入一個項
}
void MainWindow::on_actListAppend_triggered()
{//增加一個項
QIcon aIcon;
aIcon.addFile(":/images/icons/check2.ico"); //設定圖標
bool chk=ui->chkBoxListEditable->isChecked();//是否可編輯
QListWidgetItem* aItem=new QListWidgetItem("New Added Item"); //創(chuàng)建一個Item
aItem->setIcon(aIcon); //設置圖標
aItem->setCheckState(Qt::Checked); //設置為checked
if (chk) //設置標志
aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
else
aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
ui->listWidget->addItem(aItem);//增加一個項
}
void MainWindow::on_actListDelete_triggered()
{ //刪除當前項
int row=ui->listWidget->currentRow();//當前行
QListWidgetItem* aItem=ui->listWidget->takeItem(row); //移除指定行的項,但不delete
delete aItem; //需要手工刪除對象
// QListWidgetItem *QListWidget::takeItem(int row)
// Removes and returns the item from the given row in
// the list widget; otherwise returns 0.
// Items removed from a list widget will not be managed by Qt,
// and will need to be deleted manually.
}
void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
{
Q_UNUSED(pos);
QMenu* menuList=new QMenu(this); //創(chuàng)建菜單
//添加Actions創(chuàng)建菜單項
menuList->addAction(ui->actListIni);
menuList->addAction(ui->actListClear);
menuList->addAction(ui->actListInsert);
menuList->addAction(ui->actListAppend);
menuList->addAction(ui->actListDelete);
menuList->addSeparator();
menuList->addAction(ui->actSelALL);
menuList->addAction(ui->actSelNone);
menuList->addAction(ui->actSelInvs);
menuList->exec(QCursor::pos()); //在鼠標光標位置顯示右鍵快捷菜單
delete menuList; //手工創(chuàng)建的指針必須手工刪除
}
void MainWindow::on_toolBox_currentChanged(int index)
{
ui->tabWidget->setCurrentIndex(index);//ToolBox當前頁與tabWidget的當前頁聯(lián)動
}
void MainWindow::on_actSelALL_triggered()
{ //項全選
int cnt=ui->listWidget->count();//項個數(shù)
for (int i=0; i<cnt; i++)
{
QListWidgetItem *aItem=ui->listWidget->item(i);//獲取一個項
aItem->setCheckState(Qt::Checked);//設置為選中
}
}
void MainWindow::on_actSelNone_triggered()
{ //全不選
int i,cnt;
QListWidgetItem *aItem;
cnt=ui->listWidget->count();//項個數(shù)
for (i=0; i<cnt; i++)
{
aItem=ui->listWidget->item(i);//獲取一個項
aItem->setCheckState(Qt::Unchecked);//不選
}
}
void MainWindow::on_actSelInvs_triggered()
{//反選
int i,cnt;
QListWidgetItem *aItem;
cnt=ui->listWidget->count();//項個數(shù)
for (i=0; i<cnt; i++)
{
aItem=ui->listWidget->item(i);//獲取一個項
if (aItem->checkState()!=Qt::Checked)
aItem->setCheckState(Qt::Checked);
else
aItem->setCheckState(Qt::Unchecked);
}
}
到了這里,關于04-6_Qt 5.9 C++開發(fā)指南_QListWidget和QToolButton的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!