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);
}
}
从上面两种实现方式,大概是我们日常工作中使用的方法,当然上面只是简单的实现,如果真正要在正在的项目中实现还有一定距离,但这里我们在这里抛个砖吧。
代码实现