C++ Qt QListWidget应用
有大量重复、排列有序、或需动态更新的元素时,可以使用QListWidget。如展示数据表格时。尤其是在需要动态插入新数据,需要根据数据大小插入到对应位置时,此控件可以高效运作。此时可取代静态的layout+label的解决方案。常见例子:根据排名动态更新得分。
本文涉及的开发中常见问题:
- 如何设置背景透明
- 如何设置隐藏外部框线
- 如何设置隐藏滚动条
- 如何设置字体等样式
- 如何在指定位置插入
1.创建并添加内容
如果使用C++代码创建QListWidget,需包含头文件
#include <QListWidget>
QListWidget* mListWidget = new QListWidget();
QListWideget内一般为添加QLabel等以文字图片等简单内容的控件,添加QLabel或其它继承QWidget类的自定义控件参考方法一;添加文本可参考方法二。方法一更通用,且可以实现更多效果,方法二在仅添加文字内容时更简单
1.1方法一
-
将新内容添加至表尾
QLabel* label=new QLabel("啊吧啊吧"); QListWidgetItem* item = new QListWidgetItem(mListWidget); mListWidget->setItemWidget(item,label);
在创建对象时指定了父节点为QListWidget,这时会自动将其添加至表尾,无需再额外使用mListWidget->addItem(item);如没有设置父节点则需要使用,且需先addItem再setItemWidget
QLabel或其它控件需为指针类型,使用QLabel label,然后setItemWidget(item,&label)虽然也可以通过编译,但若该内容为局部变量,其生命周期结束后将无法再被引用,极易引发异常,强烈不建议使用。
-
将新内容插入至指定行
QLabel* label=new QLabel("啊吧啊吧"); QListWidgetItem* item = new QListWidgetItem(); mListWidget->insertItem(row, item); mListWidget->setItemWidget(item, label);
在创建QListWidgetItem时,不要设置父节点,即()内不要加参数,否则会被立刻添加至表尾。
必须先insertItem,再setItemWidget! 顺序不对则可能会插入空行!
之后想修改内容,可直接修改label。
若label指针与item指针没有保存,则可通过mListWidget->item(row)获取第row+1行的QListWidgetItem,
通过QWidget* pCurWiget = mListWidget->itemWidget(mListWidget->item(row))获取item对应的QWidget
1.2 方法二
-
将新内容添加至表尾
QListWidgetItem* item = new QListWidgetItem(mListWidget); mListWidget->setItemWidget(item,"啊吧啊吧");
不创建QLabel,直接以字符串创建item,此种方式适用于只显示文本信息的情况
-
将新内容插入至指定行
listWidget->insertItem(row,"啊吧啊吧");
这种方式插入只需一行代码。
2.设置属性
实例化后即可对其一些基本属性进行设置。可参考QtDesigner可视化设计时右侧的属性列表,下面介绍常用的属性
-
font 字体 直接setFont对QListWidget设定字体,优先级低于stylesheet
QFont font(QStringLiteral("HGHT_CNKI"), 18); mListWidget->setFont(font);
-
stylesheet样式表
在designer中直接设置即可,在代码中使用需改为字符串格式,然后setStyleSheet
QString style; listWidget->setStyleSheet(style);
-
设置背景透明 这样使整个控件背景透明,而不再是白色背景色
QListWidget{background-color:transparent;}
-
设置行间距 本质是设置QListWidgetItem的样式,不过可以直接在QListWidget的样式表中设置
QListWidget::Item{ padding-top:3px; padding-bottom:3px; height:49px;}
-
设置字体 如果是用方法一创建的对象,那么可以直接设置对应的样式表,如item用的是QLabel的话,只需如下设定就可以应用到QListWidget的所有子QLabel控件 ,且可直接设置文本颜色
QLabel{font: 18pt "华光黑体_CNKI";color: rgb(255, 255, 255);}
如果是用方法二创建的,那么可以用上述类似方法字体,但文字颜色需要使用如下代码设置
listWidget->item(row)->setTextColor(QColor);
-
-
设置隐藏框线
listWidget->setFrameShape(QListWidget::NoFrame);
-
设置隐藏滚动条并禁用滚动功能
//隐藏滚动条 listWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //禁止鼠标选择item listWidget->setSelectionMode(QAbstractItemView::NoSelection); //设置如下代码后可隐藏第一个框框,可自行查看不设置的情况 listWidget->setDisabled(true);