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的使用 的相关文章

随机推荐

  • 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