Qt QToolButton和QListWidget的使用

2023-11-14

1.本篇简介:

本篇主要演示QListWidget的使用,还涉及工具箱(QToolBox)和工具按钮(QToolButton)的使用,还会通过Action创建工具按钮的下拉菜单和QListWidget的组件的快捷菜单。展示如下图:

2.QListWidget

QListWidget是显示列表的组件,列表的每一项是一个QListWidgetItem对象,一个项存储了文字、图表和用户数据。

3.常用的API(Qt开发文档有所有API的介绍,建议开发时参考)

void addItem(const QString &label)  //添加一项标签

void addItem(QListWidgetItem *item) //添加一项item

void insertItem(int row, QListWidgetItem *item)  //在row行后添加一项item

QListWidgetItem * item(int row) //在row行的项

QListWidgetItem *takeItem(int row)  //删除第row行的项,注意qt不会给你释放内存,需要手动释放,只会从界面上删除该项

void clear() //清空界面

void setAlternatingRowColors(bool) //设置是否开启交替颜色显示

常用signals:

void currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) //当前项改变发出信号

void currentRowChanged(int currentRow) //当前行改变发出信号

void currentTextChanged(const QString ¤tText) //当前项改变发出信号

void itemClicked(QListWidgetItem *item)  //点击项时发出信号

void itemDoubleClicked(QListWidgetItem *item) //双击发出信号

void itemEntered(QListWidgetItem *item) //鼠标进入某项发出信号

void itemPressed(QListWidgetItem *item) //鼠标按住某项发出信号

void itemSelectionChanged() //改变选择项时发出信号

4.代码展示:

部署一个ui界面:

 

 开发顺序就按上图的数字标记,这ui画起来有点费时间,文章头部附有源码,供大家参考。

①先是开发toolbar内的toolbutton

上图共有5个ui画的button,展示其中一个实现,其他实现参考源代码。

//“初始化列表”Action
void MainWindow::on_actListIni_triggered()
{
    QListWidgetItem *pmItem;
    QIcon aIcon;
    aIcon.addFile(":/images/icons/check2.ico");
    bool chk = ui->chkBoxListEditable->isChecked();    //判断可编辑(checkBox)是否为true

    ui->listWidget->clear();        //清空初始化内容

    for(int i=0; i<10; i++)
    {
        QString str = QString("Item %1").arg(i);
        pmItem = new QListWidgetItem();

        pmItem->setText(str);
        pmItem->setIcon(aIcon);
        pmItem->setCheckState(Qt::Checked);

        if(chk)
            pmItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |Qt::ItemIsEditable |Qt::ItemIsEnabled);
        else
            pmItem->setFlags( Qt::ItemIsUserCheckable |Qt::ItemIsSelectable |Qt::ItemIsEnabled);
            ui->listWidget->addItem(pmItem);    //向listwidget添加10个Item
    }
}

②为QToolButton设置Action

//为QToolButton按钮设置Action
void MainWindow::setActionsForButton()
{
    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);      //反选
}

setDefaultAction:将toolbutton关联上action。

③配置全选、空选、反选按钮

//"全选"Action
void MainWindow::on_actSelALL_triggered()
{
    QListWidgetItem *pmItem;
    int cnt = ui->listWidget->count();
    for(int i = 0; i < cnt; ++i)
    {
            pmItem = ui->listWidget->item(i);   //遍历拿到每个item
            pmItem->setCheckState(Qt::Checked);
    }
}
//"空选"Action
void MainWindow::on_actSelNone_triggered()
{
    QListWidgetItem *pmItem;
    int cnt = ui->listWidget->count();
    for(int i = 0; i < cnt; ++i)
    {
            pmItem = ui->listWidget->item(i);   //遍历拿到每个item
            pmItem->setCheckState(Qt::Unchecked);
    }
}

//"反选"Action
void MainWindow::on_actSelInvs_triggered()
{
    QListWidgetItem *pmItem;
    int cnt = ui->listWidget->count();
    for(int i = 0; i < cnt; ++i)
    {
        pmItem = ui->listWidget->item(i);   //遍历拿到每个item
        if(pmItem->checkState() == Qt::Checked)
            pmItem->setCheckState(Qt::Unchecked);
        else
            pmItem->setCheckState(Qt::Checked);
    }
}

④配置toolbar和listwidget上的项选择下拉菜单,添加退出action

void MainWindow::createSelectionMenu()
{
    //创建下拉菜单
    QMenu *menuSelection = new QMenu(this);
    menuSelection->addAction(ui->actSelALL);
    menuSelection->addAction(ui->actSelNone);
    menuSelection->addAction(ui->actSelInvs);

    //listWidget上方的tBtnSelectItem按钮
    ui->tBtnSelectItem->setPopupMode(QToolButton::MenuButtonPopup);
    ui->tBtnSelectItem->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    ui->tBtnSelectItem->setDefaultAction(ui->actSelPopMenu);
    ui->tBtnSelectItem->setMenu(menuSelection);

    //工具栏上的下拉式菜单按钮
    QToolButton *pmBtn = new QToolButton(this);
    pmBtn->setPopupMode(QToolButton::InstantPopup);
    pmBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    pmBtn->setDefaultAction(ui->actSelPopMenu);
    pmBtn->setMenu(menuSelection);
    ui->toolBar->addWidget(pmBtn);

    ui->toolBar->addSeparator();    //添加分割器

    ui->toolBar->addAction(ui->actQuit);    //添加退出action
}

⑤对listwidget中的Item排序操作

//是否允许排序
void MainWindow::on_chkBoxSorting_clicked(bool checked)
{
    ui->listWidget->setSortingEnabled(checked);
    //qDebug()<<"chkBoxSorting:"<<ui->chkBoxSorting->click();
    qDebug() <<"chkBoxSorting:" <<ui->chkBoxSorting->checkState();
    qDebug() <<"checked" <<checked;
}

//升序排序
void MainWindow::on_tBtnSortAsc_clicked()
{
    if(ui->chkBoxSorting->checkState())
        ui->listWidget->sortItems(Qt::AscendingOrder);
    else
        QMessageBox::information(this,"友情提醒","请打开允许排序按钮");
}

//降序排序
void MainWindow::on_tBtnSortDes_clicked()
{
    if(ui->chkBoxSorting->checkState())
        ui->listWidget->sortItems(Qt::DescendingOrder);
    else
        QMessageBox::information(this,"友情提醒","请打开允许排序按钮");
}

⑥listWidget的currentItemChanged()信号,并在toolbox中信号发射时机页中显示

void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
    QString str;
    if(current != NULL)
    {
        if(previous == NULL)
            str = "当前: " +current->text();
        else
            str ="前一项:"+previous->text()+ ";当前: " +current->text();
        ui->currentLineEdit->setText(str);
        ui->plainTextEdit->appendPlainText("currentItemChanged()信号被发射");
    }


}

⑦配置鼠标右击加载操作action列表

void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
{
    Q_UNUSED(pos)
    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);      //反选

    QMenu *pmMenuList = new QMenu(this);
    pmMenuList->addAction(ui->actListIni);
    pmMenuList->addAction(ui->actListClear);
    pmMenuList->addAction(ui->actListInsert);
    pmMenuList->addAction(ui->actListAppend);
    pmMenuList->addAction(ui->actListDelete);

    pmMenuList->addSeparator();

    pmMenuList->addAction(ui->actSelALL);
    pmMenuList->addAction(ui->actSelNone);
    pmMenuList->addAction(ui->actSelInvs);
    pmMenuList->exec(QCursor::pos());

    ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt QToolButton和QListWidget的使用 的相关文章

  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • 我应该使用 QCoreApplication::processEvents() 还是 QApplication::processEvents()?

    我有一个从两者调用的方法QThreads和主线程 这个方法有时可能需要很长时间才能在循环中进行计算 所以我把QCoreApplication processEvents 这可以防止 GUI 冻结 在某个时刻我已经改变了QCoreApplic
  • 无法将 QList 分配给 QString

    我遇到这个错误 Unable to assign QList
  • Qml 和模糊图像

    我想使用 QML 实现模糊效果 我找到了有关 效果 模糊 的参考资料 例子 http qt gitorious org lscunha qt components lscunha qt components blobs d78feec567
  • 用 C++/Qt 编写的程序中的 RTF / doc / docx 文本提取

    我正在写一些程序Qt https en wikipedia org wiki Qt 28software 29 C 我需要从中读取文本微软Word https en wikipedia org wiki Microsoft Word RTF
  • 如何在 OS X 上的 Qt 应用程序中设置应用程序图标,足以进行分发?

    跟进这个答案 https stackoverflow com a 20918932 368896 to 这个问题 https stackoverflow com questions 20909341 what is the fastest
  • 如何让小部件在上下文菜单出现时接收鼠标释放事件

    在Ubuntu20 04上 当上下文菜单出现时 我无法让小部件接收鼠标释放事件 而Windows可以接收 我的pyqt版本是5 15 2 我考虑过手动发送鼠标释放事件 但我不知道当上下文菜单出现时哪些系统会收到鼠标释放事件 这样做可能会导致
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • 如何将自定义 Qt 类型与 QML 信号一起使用?

    我在 Qt 5 2 qml 应用程序中创建了一个自定义类型 class Setting public QObject Q OBJECT Q PROPERTY QString key READ key WRITE setKey Q PROPE
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • 如何在Android中使用QML - QWebView

    我想在 Android 中部署一个 YouTube 应用程序 但它只能在我的电脑上运行 在安卓上不起作用 它不加载任何视频 问题仅出在 QWebView 上 我使用了与此类似的代码 http doc qt io archives qt 5
  • QTabWidget 选项卡在垂直方向,但文本在水平方向

    我正在尝试用 C Qt 制作一个带有这样的侧边栏的应用程序 但是当将 QTabWidget 方向设置为西时 它会使文本垂直 如何让文本位于左侧 但水平对齐 PS 我不需要图标 提前致谢 您可以使用QListWidget http doc q
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目
  • 通过单击内部小部件而不是标题栏来移动窗口

    在 Windows 中 当我创建 QMainWindow 时 我可以通过单击标题栏并拖动它来在屏幕上移动它 在我的应用程序中 我使用隐藏了标题栏setWindowFlags Qt CustomizeWindowHint 我正在尝试使用小部件
  • QAbstractItemModel 如何表示树?

    我仍然很难理解 QAbstractItemModel 对项目的表示 有两种返回 QModelIndex 项的方法对我来说没有任何意义 QModelIndex QAbstractItemModel index int row int colu
  • 如何将 QFile 与 std::iostream 一起使用?

    是否可以像 std iostream 一样使用 QFile 我很确定那里一定有一个包装纸 问题是在哪里 我有另一个库 它需要 std istream 作为输入参数 但在我的程序中 此时我只有一个 QFile 我使用以下代码提出了自己的解决方
  • 是否可以根据 QSlider 的位置来改变其手柄的颜色?

    我非常清楚如何通过样式表自定义 QSlider 但我想知道是否可以执行以下操作 我希望滑块的手柄从蓝色变为黄色 当设置在左侧时 它是蓝色的 设置在左侧时 它是蓝色的 当你将它向右移动时 它会出现从蓝色到黄色的渐变 如果可以通过样式表 如何实
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur

随机推荐

  • Quartus II 之1位全加器

    文章目录 一 半加器和1位全加器原理 1 半加器 2 1位全加器 二 实验目的 三 设计半加器 1 新建项目 2 创建原理图 3 半加器仿真 四 设计全加器 五 硬件下载测试 1 引脚绑定 2 下载测试 六 Verilog语言设计 七 总结
  • 分享一个轻量级免费UML绘图工具JUDE

    一 介绍 JUDE Java and UML Developers Environment 一个小巧实用的UML建模软件 绝对可以符合UML建模的要求 可以画CLASS USECASE STATECHART ACTIVITY OBJECT
  • jmeter 参数传递 无效

    问题 上个接口的返回值用于下个接口的入参 上个接口的返回值获取失败 解决 返回值获取需要从第一级开始 而不是想要的字段位置开始 且 后有一个点
  • 性能测试 —— Jmeter 命令行详细

    我们在启动Jmeter时 会看见 Don t use GUI mode for load testing only for Test creation and Test debugging For load testing use CLI
  • Ant Design Pro安装及简单搭建

    目录 一 node js npm及yarn安装及配置 二 Ant Design Pro安装及简单构建 Ant Design Pro 是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端 设计解决方案 致力于在设计规范和基
  • Linux opencv打开摄像头和opencv旋转90和180度

    1 opencv打开摄像头 include
  • Unity与安卓arr简单调用

    前言 简单记录一下 方便后期第三方SDK做参考 一 在AndroidStudio创建空项目 二 创建空模块 复制classes jar至创建新模块的lib中 并加入设置Library classes jar文件来自你当前要使用的arr的Un
  • 深度学习MRI重建综述

    参考文章 A review and experimental evaluation of deep learningmethods for MRI reconstruction 文字有点乱 可以看表格 基于展开的方法 Yang et al
  • C#中对txt文件的读写操作

    C 中对txt文件进行读写操作包括两种方式 一种是基于FileInfo类 调用该类的Read方法 但是该方法读出来的数据是byte格式 需要对其进行解码 将相应的字节数转换为字符 而C 中System Text引用就包含的解码的方法 相应代
  • php消息队列的应用

    欢迎加入 新群号码 99640845 最近打算开发一个新功能 计划应用消息队列 以前对消息队列都是简单的理论了解 真正应用之后把自己的感觉和一些理解整理下来 说正事分割线 具体的业务场景如下 用户下单 生成订单 支付 返回支付信息 就是正常
  • el-tab切换时echarts图表宽度变为100px

    由于el tabs切换的时候 不显示的tab内容默认通过display none 所以导致echarts图表为100px 解决办法 在图表上使用v if来解决
  • c++ 九九乘法表,倒计时,成语接龙等游戏源代码

    include
  • 数据结构之顺序表详解

    目录 前言 1 顺序表 2 顺序表及其功能实现 2 1 准备工作 2 2 顺序表结构的创建 2 3 顺序表的初始化 2 4 顺序表向后插入数据 2 5 打印函数的实现 2 5 顺序表从后删除数据 2 6 顺序表向前插入数据 2 7 顺序表从
  • chrome45以后的版本安装lodop后,仍提示未安装解决

    请先查看你chrome浏览器的版本 如果是45版本以前的版本 安装后仍提示 未安装 或 请升级 请参照本链接解决 http blog sina com cn s blog 721e77e50102vfjl html 以下是chrome版本4
  • 一键部署设计稿至线上 —— D2C国产神器

    微软近期推出了Power Apps 新功能 Express Design 只要上传一个草图或者是 Figma 文件 Express Design 都会在几秒钟之内用 AI 技术将其转化为一个应用程序 不写代码就能生成一个应用 一直以来是我们
  • 服务器上调试程序 pdb命令调试

    以前写python一直用pycharm 调试啥的比较方便 最近要在远程服务器上调试一些程序 只有一个控制台就可以用pdb进行调试了 常用的只有几个命令 break 或 b 设置断点 continue 或 c 继续执行程序 list 或 l
  • 输入一个字符串,判断其是否是回文。(回文:即正读和反读都一样,如abccba, abccba)

    输入一个字符串 判断其是否是回文 回文 即正读和反读都一样 如abccba abccba 这里讨了个巧用了strcmp函数 注 strcmp用法 字符串比较函数 一般形式为strcmp 字符串1 字符串2 比较规则 对两个字符串自左至右逐个
  • linux 系统留后门方法和清除日志

    1 setuid cp bin sh tmp sh chmod u s tmp sh 加上 suid 位到shell上 虽然很简单 但容易被发现 2 echo hack 0 0 bin csh gt gt etc passwd 即给系统增加
  • 剑指 Offer 62. 圆圈中最后剩下的数字(java+python)

    0 1 n 1这n个数字排成一个圆圈 从数字0开始 每次从这个圆圈里删除第m个数字 删除后从下一个数字开始计数 求出这个圆圈里剩下的最后一个数字 例如 0 1 2 3 4这5个数字组成一个圆圈 从数字0开始每次删除第3个数字 则删除的前4个
  • Qt QToolButton和QListWidget的使用

    1 本篇简介 本篇主要演示QListWidget的使用 还涉及工具箱 QToolBox 和工具按钮 QToolButton 的使用 还会通过Action创建工具按钮的下拉菜单和QListWidget的组件的快捷菜单 展示如下图 2 QLis