04-6_Qt 5.9 C++开发指南_QListWidget和QToolButton

文章目录

  • 1. 实例简介
  • 2. 源码
    • 2.1 混合式界面设计
    • 2.2 mainwindow.h
    • 2.3 mainwindow.cpp

1. 实例简介

Qt 中用于项 (Item)处理的组件有两类,一类是 Item Views,包括 QListView、QTreeView、QTableView、QColumnView 等;另一类是 Item Widgets,包括 QListWidget、QTreeWidget 和QTableWidget。
Item Views 基于模型/视图(Model/Vicw)结构,视图 (View)与模型数据(Model Data)关联实现数据的显示和编辑,模型/视图结构的使用在第5 章详细介绍。
Item Widgets 是直接将数据存储在每一个项里,例如,QListWidget 的每一行是一个项,QTreeWidget 的每个节点是一个项,QTableWidget 的每一个单元格是一个项。一个项存储了文字文字的格式、自定义数据等。
Item Widgets 是GUI 设计中常用的组件,本节通过实例 samp4_7 先介绍 QListWidget 以及其他一些组件的用法,实例运行时界面如图 4-8 所示。

在这里插入图片描述

本实例不仅介绍QListWidget 的使用,还包括如下一些功能的实现。

  • 使用QTabWidget 设计多页界面,工作区右侧就是一个具有 3 个页面的 TabWidget 组件。
  • 使用QToolBox 设计多组工具箱,工作区左侧是一个有 3 个组的 TolBox 组件。
  • 使用分隔条(QSplitter) 设计可以左右分割的界面,工作区的 TolBox 和 TabWidget 之间有一个 splitter,运行时可以分割调整两个组件的大小。
  • 创建Actions,用Actions 设计主工具栏,用Action 关联 QToolButton 按钮。
  • 使用 QToolButton 按钮,设置与 Action 关联,设计具有下拉菜单功能的 ToolButton 按钮在主工具栏上添加具有下拉菜单的 ToolButton 按钮。
  • 使用 QListWidget,演示如何创建和添加项,为项设置图标和复选框,如何遍历列表进行选择。
  • QListWidget的主要信号currentItemChanged()的功能,编写响应槽函数。
  • 为QListWidget 组件利用已设计的 Actions 创建自定义快捷菜单。

关于上述提到详细的请参考源码及书籍

2. 源码

2.1 混合式界面设计

在这里插入图片描述

2.2 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include    <QMainWindow>
#include    <QListWidgetItem>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTprivate: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_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按钮设置Actionui->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);//菜单弹出模式,执行按钮的Actionui->tBtnSelectItem->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); //按钮样式ui->tBtnSelectItem->setDefaultAction(ui->actSelPopMenu);//关联Actionui->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; //每一行是一个QListWidgetItemQIcon 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) //可编辑, 设置flagsaItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);else//不可编辑, 设置flagsaItem->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();//项的个数for (i=0; i<cnt; i++){aItem=ui->listWidget->item(i);//获得一个项if (checked) //可编辑aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);elseaItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);}}void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{ //listWidget当前选中项发生变化QString str;if (current != NULL) //需要检测变量指针是否为空{if (previous==NULL)  //需要检测变量指针是否为空str="当前:"+current->text();elsestr="前一项:"+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"); //创建一个项aItem->setIcon(aIcon);//设置图标aItem->setCheckState(Qt::Checked); //设置为checkedif (chk) //设置标记aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);elseaItem->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"); //创建一个ItemaItem->setIcon(aIcon); //设置图标aItem->setCheckState(Qt::Checked); //设置为checkedif (chk) //设置标志aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);elseaItem->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); //移除指定行的项,但不deletedelete 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); //创建菜单//添加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(QCursor::pos()); //在鼠标光标位置显示右键快捷菜单delete menuList; //手工创建的指针必须手工删除
}void MainWindow::on_toolBox_currentChanged(int index)
{ui->tabWidget->setCurrentIndex(index);//ToolBox当前页与tabWidget的当前页联动
}void MainWindow::on_actSelALL_triggered()
{ //项全选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);elseaItem->setCheckState(Qt::Unchecked);}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 完成串口通信RS485

C# 完成串口通信RS485|RS232上下位机交互 第零步&#xff1a; 我用的是电脑usb 转串口的所以首先是驱动程序下载&#xff0c;我们用的是CH341 下载地址&#xff1a;https://www.wch.cn/downloads/CH341SER_EXE.html 第一步&#xff1a;连接机器 RS485 上面有三个端子&#xf…

深度学习与计算机相结合:直播实时美颜SDK的创新之路

时下&#xff0c;实时美颜技术就成为了直播主们的得力工具&#xff0c;它可以在直播过程中即时处理视频画面。而支持实时美颜功能的SDK更是推动了这项技术的发展&#xff0c;让直播主和普通用户都能轻松使用美颜功能。 一、美颜技术的演进 早期的美颜技术主要依赖于简单的图…

eclipse Java Editor Templates

​ Window - Preferences - Java - Editor - Templates ​ date ${currentDate:date(yyyy.MM.dd)}

Java版工程行业管理系统源码-专业的工程管理软件-em提供一站式服务

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

塔矢行洋对战藤原佐为,谁才是最接近神之一手的人

大家好, 我是嘉宾, 今天我们来盘点一下古今第一高手对局 &#xff0c;塔矢行洋对战藤原佐为&#xff0c;谁才是最接近神之一手的人&#xff0c; 在所有设定都点击好之后, 塔矢行洋下出了自己的第一步 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 佐…

【每日一题】—— B. Maximum Rounding(Codeforces Round 891 (Div. 3))

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

VIM 编辑器: Bram Moolenaar

VIM 用了很长时间&#xff0c; 个人的 VIM 配置文件差不多10年没有更新了。以前写程序的时候&#xff0c; 编辑都用这个。 linux kernel&#xff0c; boost规模的代码都不在话下。现在虽然代码写的少了&#xff0c;依然是我打开文件的首选。 现在用手机了&#xff0c;配个蓝牙键…

无涯教程-Perl - endnetent函数

描述 此功能告诉系统您不再希望使用getnetent从网络列表中读取条目。 语法 以下是此函数的简单语法- endnetent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perluse Socket;while ( ($name, $aliases, $addrtype, $net) getnetent() )…

Android 9-- 源码角度: Home键的监听和拦截

在做应用层APP需求的过程中&#xff0c;HOME键的监听&#xff0c;Back键的监听&#xff0c;这都是很常见的问题&#xff0c;那你有试过&#xff0c;去拦截HOME键的事件吗&#xff0c;有去了解过如何处理吗&#xff0c;流程如何 首先大家应该先了解一种情况&#xff0c;就是Andr…

Linux tun虚拟网卡通信初识

什么是linux tun设备 Linux TUN 设备是一种虚拟网络设备&#xff0c;用于在用户空间和内核空间之间建立数据通道&#xff0c;使用户空间程序可以通过这个设备与内核网络栈进行交互。TUN 设备是一种通用的网络隧道设备&#xff0c;常用于实现虚拟专用网络&#xff08;VPN&#…

【湍流介质的三维传播模拟器】全衍射3-D传播模拟器,用于在具有随机和背景结构的介质中传播无线电和光传播(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

华为OD机试(含B卷)真题2023 算法分类版,58道20个算法分类,如果距离机考时间不多了,就看这个吧,稳稳的

目录 一、数据结构1、线性表2、优先队列3、滑动窗口4、二叉树5、并查集6、栈 二、算法1、基础算法2、字符串3、图4、动态规划5、数学 三、漫画算法2&#xff1a;小灰的算法进阶参与方式 很多小伙伴问我&#xff0c;华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如…

中文版开源Llama 2同时有了语言、多模态大模型,完全可商用

可以说&#xff0c;AI 初创公司 LinkSoul.Al 的这些开源项目让海外开源大模型在国内的普及和推广速度与国际几乎保持了一致。 7 月 19 日&#xff0c;Meta 终于发布了免费可商用版本 Llama 2&#xff0c;让开源大模型领域的格局发生了巨大变化。 Llama 2 模型系列包含 70 亿、…

Python识别抖音Tiktok、巨量引擎滑块验证码识别

由于最近比较忙&#xff0c;所以本周搞了一个相对简单的验证码&#xff0c;就是抖音Tiktok的滑块验证码&#xff0c;这也是接到客户的一个需求。这种验证码通常在电脑端登录抖音、巨量引擎的的时候出现。 首先看一下最终的效果&#xff1a; 验证码识别过程 1、利用爬虫采集图…

查看单元测试用例覆盖率新姿势:IDEA 集成 JaCoCo

1、什么是 IDEA IDEA 全称 IntelliJ IDEA&#xff0c;是 Java 编程语言开发的集成环境。IntelliJ 在业界被公认为最好的 Java 开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE 支持、各类版本工具(git、SVN 等)、JUnit、CVS 整合、代码分析、 创新的 GUI…

04-5_Qt 5.9 C++开发指南_QComboBox和QPlainTextEdit

文章目录 1. 实例功能概述2. 源码2.1 可视化UI设计2.2 widget.h2.3 widget.cpp 1. 实例功能概述 QComboBox 是下拉列表框组件类&#xff0c;它提供一个下拉列表供用户选择&#xff0c;也可以直接当作一个QLineEdit 用作输入。OComboBox 除了显示可见下拉列表外&#xff0c;每个…

【Python学习】Python大版本新增内容精选

&#x1f308;据说&#xff0c;看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言&#xff1a; &#x1f9e1;作者简介&#xff1a;大家好我是 user_from_future &#xff0c;意思是 “ 来自未来的用户 ” &#xff0c;寓意着未来的自己一定很棒~ ✨个…

flutter:Future、Stream、RxDart

Future 在Flutter中&#xff0c;Future是Dart语言中的一个类&#xff0c;用于表示异步操作的结果。与Future相关的的重要关键字包括async和await。 async&#xff1a;这个关键字用于在方法或函数声明前添加&#xff0c;以指示该方法为异步方法。在异步方法中&#xff0c;执行…

IPv6地址分类,EUI-64转换规则

1、可聚合的单全球单播地址Global Unique Address&#xff1a; Aggregate global unicast address&#xff0c;前3位是001&#xff0c;即2000::/3&#xff0c;目前IANA已经将一部分可聚合全球单播进行了专门使用&#xff0c;如&#xff1a;2001::/16用于IPV6互联网&#xff0c;…

考研数据结构上机题【36个模块77道题】5万字帮助你学会考研算法【完结篇】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…