QListWidget、QMenu、Action、customContextMenuRequested

QListWidget的初始化、清空、Append添加、Insert添加、删除item

QListWidget的事件的使用

QToolBox的使用,每个Page可以添加其他控件

QToolBar使用代码添加QMenu,QMenu添加3个Action

QToolButton绑定Action

布局

其中 QSplitter比较特殊, 允许在水平或垂直方向上分割窗口中的多个子部件或控件。

添加方法,选中ToolBox和groupbox两个控件后, 右键布局→在水平方向上分割

.h

 

#ifndef LISTWIDGETEXAMPLE_H
#define LISTWIDGETEXAMPLE_H

#include <QMainWindow>
#include <QListWidgetItem>

namespace Ui {
class ListWidgetExample;
}

class ListWidgetExample : public QMainWindow
{
    Q_OBJECT

private:
    void setActionsForButton();//为工具button关联到action
    void createSelectionMenu();//创建下拉菜单
    void setItem(QListWidgetItem *item, bool editEnable);//设置一个item
    QIcon getIcon();

public:
    explicit ListWidgetExample(QWidget *parent = nullptr);
    ~ListWidgetExample();

private slots:
    void on_actListClear_triggered();

    void on_actListIni_triggered();

    void on_chkBoxListEditable_clicked(bool checked);

    void on_actListAppend_triggered();

    void on_actListDelete_triggered();

    void on_actListInsert_triggered();

    void on_actSelectAll_triggered();

    void on_actSelectNone_triggered();

    void on_actSelectInvert_triggered();

    void on_btnAsc_clicked();

    void on_btnDec_clicked();

    void on_chkAllowSort_clicked(bool checked);

    void on_listWidget_currentRowChanged(int currentRow);

    void on_listWidget_currentTextChanged(const QString &currentText);

    void on_listWidget_itemChanged(QListWidgetItem *item);

    void on_listWidget_itemEntered(QListWidgetItem *item);

    void on_listWidget_itemPressed(QListWidgetItem *item);

    void on_listWidget_itemDoubleClicked(QListWidgetItem *item);

    void on_btnClearText_clicked();

    void on_btnAddEmptyRow_clicked();

    void on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);

    void on_listWidget_customContextMenuRequested(const QPoint &pos);

private:
    Ui::ListWidgetExample *ui;
};

#endif // LISTWIDGETEXAMPLE_H

.cpp

 

#include "listwidgetexample.h"
#include "ui_listwidgetexample.h"



//将 toolButton 关联到 相应的action
void ListWidgetExample::setActionsForButton()
{
    ui->tBtnListIni->setDefaultAction(ui->actListIni);
    ui->tBtnListClear->setDefaultAction(ui->actListClear);
    ui->tBtnListAppend->setDefaultAction(ui->actListAppend);
    ui->tBtnListInsert->setDefaultAction(ui->actListInsert);
    ui->tBtnListDelete->setDefaultAction(ui->actListDelete);

    ui->tBtnSelAll->setDefaultAction(ui->actSelectAll);
    ui->tBtnSelNone->setDefaultAction(ui->actSelectNone);
    ui->tBtnSelnvert->setDefaultAction(ui->actSelectInvert);
}
//在toolBar中创建一个下拉菜单
void ListWidgetExample::createSelectionMenu()
{
    //创建下拉菜单 加入全选、空选、反选
    QMenu *menuSelection = new QMenu(this);
    menuSelection->addAction(ui->actSelectAll);
    menuSelection->addAction(ui->actSelectNone);
    menuSelection->addAction(ui->actSelectInvert);

    //在listWidget的tBtnSelection 关联menu 关联action
    ui->tBtnSelectItem->setPopupMode(QToolButton::MenuButtonPopup);
    // ui->tBtnSelectItem->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    ui->tBtnSelectItem->setDefaultAction(ui->actSelPopMenu);
    ui->tBtnSelectItem->setMenu(menuSelection);

    //工具栏 toolBar新建一个ToolBatton 然后关联menu 关联action
    QToolButton *btn = new QToolButton(this);
    btn->setPopupMode(QToolButton::InstantPopup);
    btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    btn->setMenu(menuSelection);
    btn->setText("选择");
    QIcon icon;
    icon.addFile("://images/icon.bmp");
    btn->setIcon(icon);
    ui->toolBar->addWidget(btn);

    //最后在工具栏toolBar增加一个分隔符,然后加入退出
    ui->toolBar->addSeparator();
    ui->toolBar->addAction(ui->actQuit);

}

ListWidgetExample::ListWidgetExample(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::ListWidgetExample)
{
    ui->setupUi(this);

    setCentralWidget(ui->splitter); //设置中心组件
    ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);//不设置这句,无法弹出自定义菜单
    this->setActionsForButton();
    this->createSelectionMenu();
}

ListWidgetExample::~ListWidgetExample()
{
    delete ui;
}

void ListWidgetExample::on_actListClear_triggered()
{
    ui->listWidget->clear();
}
//设置item的flag属性
void ListWidgetExample::setItem(QListWidgetItem *item, bool editEnable)
{
    if(editEnable)
        item->setFlags(Qt::ItemIsSelectable
                       |Qt::ItemIsEnabled
                       |Qt::ItemIsUserCheckable
                       |Qt::ItemIsEditable);
    else
        item->setFlags(Qt::ItemIsSelectable
                       |Qt::ItemIsEnabled
                       |Qt::ItemIsUserCheckable);
}


//初始化列表数据
void ListWidgetExample::on_actListIni_triggered()
{
    ui->listWidget->clear();
    bool chk= ui->chkBoxListEditable->isChecked();
    QIcon icon;
    icon.addFile(":/toolbar/toolbarimages/724.bmp");

    QListWidgetItem *item ;
    for(int i=0;i<10;i++)
    {
        QString str=QString("Item %1").arg(i);
        item= new QListWidgetItem();
        item->setText(str);
        item->setIcon(icon);
        item->setCheckState(Qt::Checked);
        this->setItem(item,chk);

        ui->listWidget->addItem(item);
    }
}


//点击勾选框,遍历listWidget里面的item,设置 是否可编辑。
void ListWidgetExample::on_chkBoxListEditable_clicked(bool checked)
{
    int count = ui->listWidget->count();
    QListWidgetItem *item;
    for(int i=0;i<count;i++)
    {
        item = ui->listWidget->item(i);
        this->setItem(item,checked);
    }
}

QIcon ListWidgetExample::getIcon()
{
    QIcon icon;
    icon.addFile(":/toolbar/toolbarimages/724.bmp");
    return icon;
}


void ListWidgetExample::on_actListAppend_triggered()
{
    QListWidgetItem *item = new QListWidgetItem("Added Item");
    item->setIcon(this->getIcon());
    item->setCheckState(Qt::Checked);
    this->setItem(item,ui->chkBoxListEditable->isChecked());
    ui->listWidget->addItem(item);
}

void ListWidgetExample::on_actListInsert_triggered()
{
    QListWidgetItem *item = new QListWidgetItem("Inserted Item");
    item->setIcon(this->getIcon());
    item->setCheckState(Qt::Checked);
    this->setItem(item,ui->chkBoxListEditable->isChecked());
    ui->listWidget->insertItem(ui->listWidget->currentRow(),item);
}


void ListWidgetExample::on_actListDelete_triggered()
{
    int row = ui->listWidget->currentRow();
    QListWidgetItem *item = ui->listWidget->takeItem(row);
    delete item;//需要手工删除对象
}







void ListWidgetExample::on_actSelectAll_triggered()
{
    for(int i=0;i<ui->listWidget->count();i++)
    {
        QListWidgetItem *item = ui->listWidget->item(i);
        item->setCheckState(Qt::Checked);//设置为选中
    }
}


void ListWidgetExample::on_actSelectNone_triggered()
{
    for(int i=0;i<ui->listWidget->count();i++)
    {
        QListWidgetItem *item = ui->listWidget->item(i);
        item->setCheckState(Qt::Unchecked);//设置为不选中
    }
}


//反选
void ListWidgetExample::on_actSelectInvert_triggered()
{
    for(int i=0;i<ui->listWidget->count();i++)
    {
        QListWidgetItem *item = ui->listWidget->item(i);
        if(item->checkState()!= Qt::Checked)
            item->setCheckState(Qt::Checked);
        else
            item->setCheckState(Qt::Unchecked);//设置为不选中
    }
}






void ListWidgetExample::on_btnAsc_clicked()
{
    ui->listWidget->sortItems(Qt::AscendingOrder);
}



void ListWidgetExample::on_btnDec_clicked()
{
    ui->listWidget->sortItems(Qt::DescendingOrder);
}



void ListWidgetExample::on_chkAllowSort_clicked(bool checked)
{
    ui->listWidget->setSortingEnabled(checked);
}


void ListWidgetExample::on_listWidget_currentRowChanged(int currentRow)
{
    ui->plainTextEdit->appendPlainText(
        QString("currentRowChanged,currentRow=%1").arg(currentRow)
        );
}




void ListWidgetExample::on_listWidget_currentTextChanged(const QString &currentText)
{
    ui->plainTextEdit->appendPlainText(
        QString("currentTextChanged,currentText=%1").arg(currentText)
        );
}

void ListWidgetExample::on_listWidget_itemChanged(QListWidgetItem *item)
{
    ui->plainTextEdit->appendPlainText(
        QString("itemChanged,itemText=%1").arg(item->text())
        );
}


void ListWidgetExample::on_listWidget_itemEntered(QListWidgetItem *item)
{
    ui->plainTextEdit->appendPlainText(
        QString("itemEntered,itemText=%1").arg(item->text())
        );
}


void ListWidgetExample::on_listWidget_itemPressed(QListWidgetItem *item)
{
    ui->plainTextEdit->appendPlainText(
        QString("itemPressed,itemText=%1").arg(item->text())
        );
}


void ListWidgetExample::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
    ui->plainTextEdit->appendPlainText(
        QString("itemDoubleClicked,itemText=%1").arg(item->text())
        );
}


void ListWidgetExample::on_btnClearText_clicked()
{
    ui->plainTextEdit->clear();
}


void ListWidgetExample::on_btnAddEmptyRow_clicked()
{
    ui->plainTextEdit->appendPlainText("");
}


void ListWidgetExample::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
    QString str;
    if(current!=NULL)
    {
        if(previous!=NULL)
        {
            str=QString("前项:%1 当前:%2").arg(previous->text()).arg(current->text());
        }
        else
            str=QString("当前:%2").arg(current->text());
        ui->editCutItemText->setText(str);
    }
    ui->plainTextEdit->appendPlainText(QString("currentItemChanged触发"));
}

//自定义右键
void ListWidgetExample::on_listWidget_customContextMenuRequested(const QPoint &pos)
{
    ui->plainTextEdit->appendPlainText("customContextMenuRequested---开始");
    Q_UNUSED(pos);
    QMenu *menu= new QMenu(this);

    menu->addAction(ui->actListIni);
    menu->addAction(ui->actListClear);
    menu->addAction(ui->actListAppend);
    menu->addAction(ui->actListDelete);
    menu->addAction(ui->actListInsert);

    menu->addSeparator();

    menu->addAction(ui->actSelectAll);
    menu->addAction(ui->actSelectNone);
    menu->addAction(ui->actSelectInvert);

    menu->exec(QCursor::pos());//在光标处显示快捷菜单
    delete menu;  //菜单显示完,需要删除对象
    ui->plainTextEdit->appendPlainText("customContextMenuRequested---结束");

}

效果

 

 

 

疑问

setSortingEnabled之后,仍然可以ui->listWidget->sortItems(Qt::AscendingOrder);

后面再看什么问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/730356.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

策略模式:applicationContext.getBeansOfType()方法

applicationContext.getBeansOfType() 一般用来获取某个接口的所有实例Bean 方法定义如下&#xff1a; 入参一般是接口&#xff0c;即interface。响应是个Map结构&#xff0c;key bean在容器中的名称&#xff0c;value bean实列 开发步骤&#xff1a; 1.定义接口 2.定义…

NGINX_十八 nginx 访问控制

十八 nginx 访问控制 1 nginx 访问控制模块 &#xff08;1&#xff09;基于IP的访问控制&#xff1a;http_access_module &#xff08;2&#xff09;基于用户的信任登录&#xff1a;http_auth_basic_module 2 基于IP的访问控制 2.1 配置语法 Syntax&#xff1a;allow addr…

kettle从入门到精通 第七十二课 ETL之kettle 三谈http post(含文件上传),彻底掌握参数传递

场景&#xff1a;群里有个小伙伴在使用http post步骤调用接口时遇到问题&#xff0c;postman调用正常&#xff0c;但是kettle中调用异常。 解决方案&#xff1a;既然postman调用接口正常&#xff0c;肯定是http post步骤中某些参数设置的不正确导致的。那就把常用的方式都梳理下…

C++11 右值引用和移动语义

目录 1.左值引用和右值引用 2.右值引用使用场景&#xff08;移动语义&#xff09;和意义 3.右值引用引用左值及其一些更深入的使用场景分析 4.完美转发 1.左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现…

云计算考试题

Cloud ❀ 云计算-虚拟化常见的两种架构_裸金属架构和宿主型架构的区别-CSDN博客 为啥要成2 11 bcd 16 acd abcd BCD NAS为啥支持文件存储的协议 选BCD 什么是网络文件系统 选bcd 错题 选abc 选bcd 选 abd

【ARMv8/v9 GIC 系列 4.2 -- GIC CPU Interface 详细介绍】

文章目录 GIC CPU Interface 介绍CPU Interface 主要寄存器 GIC CPU Interface 介绍 A 系列处理器提供 5个管脚来实现中断&#xff0c;分别是&#xff1a; nIRQ&#xff1a;物理普通中断nFIQ&#xff1a;物理快速中断nVIRQ&#xff1a;虚拟普通中断nVFIQ&#xff1a;虚拟快速…

运算放大器(运放)积分器电路

积分器电路 运算放大器(运放)积分器电路是在图2运放反相放大器的电路上增加一个积分电容构成&#xff0c;该积分电容并联在运算放大器的反馈电阻上&#xff0c;见图1。 运算放大器(运放)反相放大器电路 设计目标 输入fMin输入f0dB输入fMax输出VoMin输出VoMax电源Vcc电源Vee1…

【JS重点19】this指向问题总结

目录 一&#xff1a;普通函数this指向 普通函数在严格模式下&#xff1a; 二&#xff1a;箭头函数this指向 this指向说明 不适用this情况 三&#xff1a;改变this指向 1 call() 语法格式&#xff1a; 作用&#xff1a; 2 apply() 语法格式&#xff1a; 作用&#x…

C#.net6.0语言+B/S架构+前后端分离 手术麻醉信息管理系统源码

C#.net6.0语言&#xff0b;B/S架构前后端分离 手术麻醉信息管理系统源码 什么是手术麻醉信息管理系统 满足医院等级评级需求 满足电子病历评级需求 满足科室需求 术前 1、患者术前评估/诊断 2、术前讨论制定手术方案 3、手术准备 4、术前准备 术中 1、送手术室 2、麻…

oracle12c到19c adg搭建(五)dg搭建后进行切换19c进行数据字典升级

一、备库切主库升级 12c切换为19c主库的时候是由低版本到高版本所以cdb和pdb的数据字典需要进行升级才可以让数据与软件版本兼容。 1.1切换 SQL> alter database recover managed standby database finish; Database altered. SQL> alter database commit to switcho…

基于 NXP LS1046 +FPGA系列 CPCI 架构轨道交通专用板卡

基于 NXP LS1046 系列 CPCI 架构轨道板卡 该产品是一款 CPCI 无风扇架构的高可靠性板卡&#xff0c;CPU 选用 NXP LS1046A 系统平台&#xff0c;支持嵌入式 Linux 或者标准 Ubuntu Linux 、凝思等操作系统&#xff0c;轨道交通 EMC 及宽温级别设计&#xff0c;板载多路 M12 高速…

SQLite扩展插件终极集合

作为一个嵌入式数据库引擎&#xff0c;SQLite 与其他数据库管理系统相比&#xff0c;缺少了一些功能。不过 SQLite 提供了一个扩展机制&#xff0c;因此我们可以在网络上找到大量的 SQLite 插件。 今天我们介绍的这个插件叫做 sqlean&#xff0c;它打包了许多流行的 SQLite 扩…

【windows】字体安装手册

windows字体安装手册 1 下载字体文件 百度搜索XXX字体ttf文件进行下载 附&#xff1a;宋体gb2312下载地址&#xff1a; https://www.downza.cn/soft/7780.html 2 字体安装 1.搜索字体 2.将下载的ttf文件拖拽添加 3.关闭办公软件重新打开后&#xff0c;outlook、word、…

装备制造业CRM解决方案

01、数字化转型驱动企业&#xff0c;向“以客户需求驱动创新生产”的智能制造业转变 我国装备制造业经过多年的发展&#xff0c;取得了令人瞩目的成就&#xff0c;形成了门类齐全、具有相当规模和一定水平的产业体系&#xff1b;主要包含通用设备、专用设备、电气机械、交通运…

GPT 模型简史:从 GPT-1 到 GPT-4

文章目录 GPT-1GPT-2GPT-3从 GPT-3 到 InstructGPTGPT-3.5、Codex 和 ChatGPTGPT-4 GPT-1 2018 年年中&#xff0c;就在 Transformer 架构诞生⼀年后&#xff0c;OpenAI 发表了⼀篇题 为“Improving Language Understanding by Generative Pre-Training”的论文&#xff0c;作者…

DS知识点总结--线性表定义及顺序表示

数据结构知识点汇总(考研C版) 文章目录 数据结构知识点汇总(考研C版)二、线性表2.1 线性表的定义和操作2.1.1 线性表的定义2.1.2 线性表的基本操作 2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表上的基本操作的实现 二、线性表 2.1 线性表的定义和操作 2.1.1 线性表的…

阿里云如何实现express的自动化部署(保姆级教程)

本篇文章将详细介绍一下阿里云如何实现express的自动化部署&#xff0c;作者本人总结的保姆级教程&#xff01;&#xff01;&#xff01; 首先去阿里云官网 &#xff08;阿里云-计算&#xff0c;为了无法计算的价值) 搜索函数计算fc 如果没有开通过选择免费开通&#xff0c;…

RockChip Android12 Settings一级菜单

一:概述 在之前的文章中对Android8.1 Settings的流程进行了说明,本章将针对Android12 Settings一级菜单的加载逻辑进行详细说明,Settings版本之间的差异不是很大,有兴趣的同学可自行学习,本文不在做赘述。 Android8.1 Settings说明:RockChip Android8.1 Settings-CSDN博…

在win10 上使用ssh连接到树莓派上

在win10 上使用ssh连接到树莓派上 树莓派上的设置 启用ssh 启用VCN和SSH&#xff0c;这样可以使用VNC和SSH远程。 win10 上的设置 安装ssh客户端 按下win键输入"应用和功能" 如果没有安装就搜索&#xff1a;OpenSSH客户端&#xff0c;安装。 连接到树莓派…

STM32---SPI通信协议(小白入、含源码)

写在前面&#xff1a;在单片机的学习过程中&#xff0c;各种通信协议的学习是必不可少的&#xff0c;在前面我们学习了串口通信、IIC通信&#xff0c;本节我们来认识一下SPI通信协议。包括其SPI基本概念、NORFLASH芯片的介绍以及相关的例程实验。 目录 一、SPI介绍 1.1什么是…