天天看點

《 QT5.9 c++ 開發指南》QListWidget 和 QToolButton

本例子基于QListWidget 和 QToolButton 來記錄的執行個體,下面我們來看看對應的結果圖吧;

《 QT5.9 c++ 開發指南》QListWidget 和 QToolButton
《 QT5.9 c++ 開發指南》QListWidget 和 QToolButton

       界面的簡單布局部分,因為要用到右鍵菜單的功能,在contextMenuPollcy 的屬性改為:CustomContextMenu, 這樣才可以點出右鍵菜單選項。如下圖:

《 QT5.9 c++ 開發指南》QListWidget 和 QToolButton

話不多說上程式:

對應頭檔案:

#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

喜歡本例子的可以關注我部落格,讓我們一起學習與進步,需要其他資源的可以私信我。

繼續閱讀