QT的Listwidget控件

一、简介

Qt 中用于项(Item)处理的组件有两类,一类是 Item Views,包括 QListView、QTreeView、 QTableView、QColumnView 等;另一类是 Item Widgets,包括 QListWidget、QTreeWidget 和 QTable Widget。QListWidget其实是QListView的遍历类,QListView 是基于模型/视图(Model/View)结构,视图(View)与模型数据(Model Data)关联实现数据的显示和编辑;而QListWidget 可直接对每一项直接操作,所以对于一些简单的界面显示,可采用QListWidget ,如果对于一些复杂的显示,实现数据和界面显示分离,可采用QListView 。

二 列表模式实例

在使用过程中,我们大部分是使用代码来实现的

void Widget::InitListWidget()
{
  listWidget = new QListWidget(this);

  QListWidgetItem* pItem1 = new QListWidgetItem(QIcon(":/resources/kits.png"), "Kits");
  QListWidgetItem* pItem2 = new QListWidgetItem(QIcon(":/resources/env.png"), u8"环境");
  QListWidgetItem* pItem3 = new QListWidgetItem(QIcon(":/resources/editor.png"), u8"编辑器");
  QListWidgetItem* pItem4 = new QListWidgetItem(QIcon(":/resources/vim.png"), "FakeVim");
  QListWidgetItem* pItem5 = new QListWidgetItem(QIcon(":/resources/help.png"), u8"帮助");

  listWidget->addItem(pItem1);
  listWidget->addItem(pItem2);
  listWidget->addItem(pItem3);
  listWidget->addItem(pItem4);
  listWidget->addItem(pItem5);

  listWidget->setFixedHeight(600);
  listWidget->setFixedWidth(300);

  initRightMenu();

  //设置菜单策略,必须设置,不然无法显示菜单
  listWidget->setContextMenuPolicy(Qt::CustomContextMenu);

  //连接信号槽
  connect(listWidget, &QListWidget::customContextMenuRequested,
      this, &Widget::on_PopupRightMenu);
}

上面的代码只是实现ListWidget的初始化,在代码中添加了右键菜单。

private slots:
    void on_PopupRightMenu(const QPoint& pos);

右键菜单的初始化:

void Widget::on_PopupRightMenu(const QPoint& pos)
{
    QListWidgetItem* pItem = listWidget->itemAt(pos);
    if (!pItem)
    {
        return;
    }

    m_pRightMenu->exec(QCursor::pos());
}
void Widget::initRightMenu()
{

    m_pRightMenu = new QMenu(this);

      QAction* pAc1 = new QAction(u8"动作1", this);
      QAction* pAc2 = new QAction(u8"动作2", this);
      QAction* pAc3 = new QAction(u8"动作3", this);
      QAction* pAc4 = new QAction(u8"删除", this);

      m_pRightMenu->addAction(pAc1);
      m_pRightMenu->addAction(pAc2);
      m_pRightMenu->addAction(pAc3);
      m_pRightMenu->addAction(pAc4);

      connect(pAc1, &QAction::triggered, [=] {
          QMessageBox::information(this, "title", "ac1");
          });

      connect(pAc4, &QAction::triggered, [=] {

          QListWidgetItem* item = listWidget->currentItem();
          listWidget->removeItemWidget(item);
          delete item;
          });

}

常用设置

插入自定义控件

QListWidgetItem *item = new QListWidgetItem;
//创建自定义widget
QCustomWidget *customWidget = new QCustomWidget(this);
/*当前自定义控件的功能设置,这里不一一展示,每个人的要求不一样*/
customWidget->show(); //必须要写show哟~
//将自定义widget插入到列表中
ui.listWidget->addItem(item);
ui.listWidget->setItemWidget(item, customWidget);

文本对齐方式

QString qsContent = QStringLiteral("插入一条数据内容");
QListWidgetItem *item = new QListWidgetItem;
item->setText(qsContent);
/*以下是重点!!!*/
item->setTextAlignment(Qt::AlignLeft|Qt::AlignVenter);
ui.listWidget->addItem(item);

添加复选框方案一

QString qsContent = QStringLiteral("插入一条数据内容");
QListWidgetItem *item = new QListWidgetItem;
item->setText(qsContent);
item->setTextAlignment(Qt::AlignLeft|Qt::AlignVenter);
/*以下是重点!!!*/
item->setCheckState(Qt::Unchecked); //设置未选中状态
ui.listWidget->addItem(item);

何获取选中的效果呢?

void QLearnListWidget::OnListWidgetltemChanged(QListWidgetltem *item)
{
  //获取当前item的状态
  Qt::CheckState state = item->checkState0
if (state == Qt::Unchecked)
{
   //未被选中item->setCheckState(Qt::Checked);
}
else if (state == Qt::Checked)
{
   //选中后取消选中item->setCheckState(Qt::Unchecked)
}
}

优点:快捷方便获取
缺点:无法对内部的QCheckBox进行风格设置

嵌入QCheckBox控件 方案二

QString qsContent = QStringLiteral("插入一条数据内容");
QListWidgetItem *item = new QListWidgetItem;
QCheckBox *check = new QCheckBox(qsContent, ui.listWidget);
check->show();
ui.listWidget->addItem(item);
ui.listWidget->setItemWidget(item, check);

需要注意的是:必须先进行addItem,再setItemWidget。否则无法显示文本内容。
优点:可以任意修改checkbox的风格。
缺点:当点击到空白区域时,无法响应QListWidget的消息。因为该条目内被QCheckBox包围,只能对QCheckBox消息处理。
排序

   ui->listWidget->setSortingEnabled(true);//生效排序
    ui->listWidget->sortItems(Qt::DescendingOrder); //降序

显示方式

ui->listWidget->setViewMode(QListView::IconMode);

缩略图模式实现

代码实现如下:

void Widget::InitPicwidget()
{
    listWidget = new QListWidget(this);
    //自定义菜单策略
    listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    //设置视图显示方式为图标模式(图标在上,文字在下)
    listWidget->setViewMode(QListView::IconMode);
    //设置可以选择多项
    listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
    //设置背景颜色,使每个子项之间的间距有颜色区别
    //ui->listWidget->setStyleSheet("background:transparent;");
    //设置无边框
    listWidget->setFrameShape(QFrame::NoFrame);
    //设置子项不能被拖拽
    listWidget->setDragEnabled(false);
    //设置子项每个图标的大小
    listWidget->setIconSize(QSize(200,200));
    //设置每个子项的大小固定
    listWidget->setUniformItemSizes(true);
    //设置QLisView大小改变时,图标的调整模式,默认是固定的,可以改成自动调整
    listWidget->setResizeMode(QListView::Adjust);
    //设置每个子项之间的间距
    listWidget->setSpacing(10);

    //设置样式,直接在函数中设置
    listWidget->setStyleSheet("QListWidget{border:1px solid gray; color:black;background:transparent;}"
                              "QListWidget::Item{padding-top:20px; padding-bottom:4px; }"
                              "QListWidget::Item:hover{background:skyblue; }"
                              "QListWidget::item:selected{background:lightgray; color:red; }"
                              "QListWidget::item:selected:!active{border-width:0px; background:lightgreen; }"
                              );
    listWidget->setFixedHeight(600);
    listWidget->setFixedWidth(300);
    // 插入数据
    for(int i=0; i<15; i++)
    {
        //创建子项,将图片作为icon,文件名作为文字描述
        QListWidgetItem *item = new QListWidgetItem;


        item->setIcon(QIcon(":/resources/kits.png"));
        //item->setSizeHint(QSize(100,50));
        //文件名作为子项的文字描述

        item->setText("Test_1");
        //设置文字对齐方向,水平居中
        item->setTextAlignment(Qt::AlignHCenter);

        //将item子项插入 listwidget控件中,或者在new子项的时候传入父控件相当于添加item
        listWidget->addItem(item);
    }
}

总结

从上面两种实现方式,大概是我们日常工作中使用的方法,当然上面只是简单的实现,如果真正要在正在的项目中实现还有一定距离,但这里我们在这里抛个砖吧。

代码实现

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在 QListView 中添加 QLabel,你可以使用自定义的 QItemDelegate。下面是一些步骤来实现这个目标: 1. 创建一个自定义的 QItemDelegate 类,并重写其 createEditor() 和 setEditorData() 方法。在 createEditor() 方法中创建 QLabel,并在 setEditorData() 方法中将数据设置给 QLabel。 ```cpp class LabelDelegate : public QItemDelegate { public: QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override { Q_UNUSED(option); Q_UNUSED(index); QLabel* label = new QLabel(parent); return label; } void setEditorData(QWidget* editor, const QModelIndex& index) const override { QLabel* label = qobject_cast<QLabel*>(editor); if (label) { QString text = index.data(Qt::DisplayRole).toString(); label->setText(text); } } }; ``` 2. 创建一个 QListView,并将自定义的 QItemDelegate 设置给它: ```cpp QListView* listView = new QListView(this); listView->setItemDelegate(new LabelDelegate()); ``` 3. 创建一个数据模型,并将其设置给 QListView: ```cpp QStringListModel* model = new QStringListModel(this); QStringList dataList; dataList << "Item 1" << "Item 2" << "Item 3"; model->setStringList(dataList); listView->setModel(model); ``` 通过上述步骤,你可以将 QLabel 添加到 QListView 中,并显示文本数据。自定义的 QItemDelegate 会在每个项上创建和设置 QLabel,从而实现在 QListView 中显示标签。你可以根据需要进一步定制 QItemDelegate 的行为,例如设置标签的样式或添加其他控件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

houxian1103

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值