Qt QToolButton和QListWidget的使用

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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值