本例子基于QListWidget 和 QToolButton 來記錄的執行個體,下面我們來看看對應的結果圖吧;
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP35UeRpmT5VkaNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0YTM2UzMxATM2ATNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
界面的簡單布局部分,因為要用到右鍵菜單的功能,在contextMenuPollcy 的屬性改為:CustomContextMenu, 這樣才可以點出右鍵菜單選項。如下圖:
話不多說上程式:
對應頭檔案:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QListWidgetItem>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
// QMenu *menuSelection; //自定義彈出式菜單
// void createListContextMenu(); //建立彈出式菜單
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單擊事件
// void on_actListSelALL_triggered(); //全選
// void on_actListSelNone_triggered(); //全不選
// void on_actListSelInvs_triggered(); //反選
//目前選擇項發生變化
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
對應cpp檔案:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenu>
//void MainWindow::createListContextMenu()
//{ //建立右鍵彈出式菜單
// menuList=new QMenu(this); //建立菜單
// //添加Actions建立菜單項
// 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->actListSelALL);
// menuList->addAction(ui->actListSelNone);
// menuList->addAction(ui->actListSelInvs);
//}
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()
{
//建立下拉菜單
QMenu* menuSelection=new QMenu(this); //建立選擇彈出式菜單
menuSelection->addAction(ui->actSelALL);
menuSelection->addAction(ui->actSelNone);
menuSelection->addAction(ui->actSelInvs);
//listWidget上方的tBtnSelectItem按鈕
ui->tBtnSelectItem->setPopupMode(QToolButton::MenuButtonPopup);//菜單彈出模式,執行按鈕的Action
ui->tBtnSelectItem->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); //按鈕樣式
ui->tBtnSelectItem->setDefaultAction(ui->actSelPopMenu);//關聯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);
//由于在設計器裡無法更改tabWidget三個頁面的文字标簽,在構造函數裡用函數修改
// ui->tabWidget->setTabText(0,"QListWidget");
// ui->tabWidget->setTabText(1,"QTreeWidget");
// ui->tabWidget->setTabText(2,"QTableWidget");
setCentralWidget(ui->splitter); //設定中心元件
setActionsForButton();
createSelectionPopMenu();
// createListContextMenu(); //建立彈出式菜單
}
MainWindow::~MainWindow()
{
delete ui;
// delete menuList; //手工建立的指針必須手工删除
}
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); //設定為選中狀态
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;
Qt::ItemFlags flags;
cnt=ui->listWidget->count();//項的個數
for (i=0; i<cnt; i++)
{
aItem=ui->listWidget->item(i);//獲得一個項
// flags=aItem->flags();
if (checked) //可編輯
aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
else
aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
// flags = flags & (!Qt::ItemIsEditable);
// aItem->setFlags(flags);
}
}
void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{ //listWidget目前選中項發生變化
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()
{ //插入一個項
// QListWidgetItem *aItem;
QIcon aIcon;
aIcon.addFile(":/images/icons/check2.ico"); //圖示
bool chk=ui->chkBoxListEditable->isChecked(); //是否可比那幾
QListWidgetItem* aItem=new QListWidgetItem("New Inserted 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->insertItem(ui->listWidget->currentRow(),aItem); //在目前行的上方插入一個項
}
void MainWindow::on_actListAppend_triggered()
{//增加一個項
// QListWidgetItem *aItem;
// bool chk;
QIcon aIcon;
aIcon.addFile(":/images/icons/check2.ico"); //設定圖示
bool chk=ui->chkBoxListEditable->isChecked();//是否可編輯
QListWidgetItem* aItem=new QListWidgetItem("New Added Item"); //建立一個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()
{ //删除目前項
// QListWidgetItem *aItem;
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; //自定義彈出式菜單
QMenu* menuList=new QMenu(this); //建立菜單
//添加Actions建立菜單項
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(pos); //在滑鼠光标位置顯示右鍵快捷菜單
menuList->exec(QCursor::pos()); //在滑鼠光标位置顯示右鍵快捷菜單
delete menuList; //手工建立的指針必須手工删除
}
void MainWindow::on_toolBox_currentChanged(int index)
{
ui->tabWidget->setCurrentIndex(index);//ToolBox目前頁與tabWidget的目前頁關聯
}
void MainWindow::on_actSelALL_triggered()
{ //項全選
// QListWidgetItem *aItem; //項對象
int cnt=ui->listWidget->count();//項個數
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();//項個數
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();//項個數
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);
}
}
連結:本文的例子 提取碼:gate
喜歡本例子的可以關注我部落格,讓我們一起學習與進步,需要其他資源的可以私信我。