Qt QListWidgetItem 多行

2023-12-01

我有一个非常简单的QListWidget对象,我想构建一个文件夹列表。 当我将一个项目添加到我的列表中时,我会执行以下操作:

void LessCC::on_addFolderButton_clicked()
{
    QString dirName = QFileDialog::getExistingDirectory(this, tr("Choose Directory"), QDir::homePath(), QFileDialog::ShowDirsOnly);
    QListWidgetItem* newItem = new QListWidgetItem(QIcon(":/resources/icons/folder.png"), dirName, 0, 0);
    this->ui->folderListWidget->addItem(newItem);
}

这是有效的,但我希望我的项目具有多行或多列信息(具有不同的样式)。

我听说过 QStyledItemDelegatebut我真的不明白它是如何工作的,因为所有其他解决方案我发现对于这样的人来说似乎真的很复杂简单的(?) thing.

这是吗only解决方案或者也许有更简单的东西我没有看到?

希望可以有人帮帮我。


在没有确切了解您希望列表项是什么样子的情况下,建议“最佳”解决方案有点困难,但我们会尝试一下。

Qt 线程上实际上有一篇很棒的帖子here最后给出了他们用来创建列表的所有代码,类似于他们在顶部显示的列表。

基本上,每个项目都有一个大图标,右侧有标题和描述文本,每个项目的样式都不同。

创建自定义委托听起来很可怕,但它基本上只是为列表提供一个自定义小部件。它的工作原理本质上就像一个模板。您可以定义列表项的外观,并使用列表中的数据来绘制它。您只需继承 QAbstractItemDelegate 即可。

#include <QPainter>
#include <QAbstractItemDelegate>

class ListDelegate : public QAbstractItemDelegate
{
    public:
       ListDelegate(QObject *parent = 0);

       void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
       QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;

       virtual ~ListDelegate();
};

最大的工作是编写绘制函数的代码。我将在这里展示基础知识,但您可以参考上面的链接以获取更长的示例。

ListDelegate::ListDelegate(QObject *parent)
: QAbstractItemDelegate(parent)
{

}

void ListDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
        QRect r = option.rect;

        QPen fontPen(QColor::fromRgb(51,51,51), 1, Qt::SolidLine);

        if(option.state & QStyle::State_Selected)
            {
            painter->setBrush(Qt::cyan);
            painter->drawRect(r);

        } 
            else 
            {
            //BACKGROUND ALTERNATING COLORS
            painter->setBrush( (index.row() % 2) ? Qt::white : QColor(252,252,252) );
            painter->drawRect(r);
        }

            painter->setPen(fontPen);

        //GET TITLE, DESCRIPTION AND ICON
        QIcon ic = QIcon(qvariant_cast<QPixmap>(index.data(Qt::DecorationRole)));
        QString title = index.data(Qt::DisplayRole).toString();
        QString description = index.data(Qt::UserRole).toString();

        int imageSpace = 10;
        if (!ic.isNull()) 
            {
            //ICON
            r = option.rect.adjusted(5, 10, -10, -10);
            ic.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft);
            imageSpace = 55;
        }

        //TITLE
        r = option.rect.adjusted(imageSpace, 0, -10, -30);
        painter->setFont( QFont( "Lucida Grande", 6, QFont::Normal ) );
        painter->drawText(r.left(), r.top(), r.width(), r.height(), Qt::AlignBottom|Qt::AlignLeft, title, &r);

        //DESCRIPTION
        r = option.rect.adjusted(imageSpace, 30, -10, 0);
        painter->setFont( QFont( "Lucida Grande", 5, QFont::Normal ) );
        painter->drawText(r.left(), r.top(), r.width(), r.height(), Qt::AlignLeft, description, &r);

}

QSize ListDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
   return QSize(200, 60); // very dumb value
}

ListDelegate::~ListDelegate()
{

}

所以你可以在这段代码中看到我们从列表中获取了三位数据。图标、标题和说明。然后我们显示绘制图标,并按照我们喜欢的方式绘制两个文本字符串。但重要的部分是获取数据本身。我们基本上是要求列表使用传递给我们的“索引”为我们提供数据。

QIcon ic = QIcon(qvariant_cast<QPixmap>(index.data(Qt::DecorationRole)));
QString title = index.data(Qt::DisplayRole).toString();
QString description = index.data(Qt::UserRole + 1).toString();

您会注意到每一位信息都是使用不同的“角色”检索的。通常,列表只显示一项内容 - 通过 DisplayRole 访问。图标存储在 DecorationRole 中。但如果您想存储更多内容,那么您可以开始使用 UserRole。您可以使用 UserRole、UserRole +1、UserRole +2 等来存储大量内容......

那么如何将所有这些信息存储在每个项目中。简单的...

QListWidgetItem *item = new QListWidgetItem();
item->setData(Qt::DisplayRole, "Title");
item->setData(Qt::UserRole, "Description");
myListWidget->addItem(item);

最后,如何使用您精美的新委托使列表显示该项目?

myListWidget->setItemDelegate(new ListDelegate(myListWidget));

希望这能澄清一些事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt QListWidgetItem 多行 的相关文章

  • QGraphicsScene没有删除QWidget的功能

    QGraphicsScene 有一个addWidget QWidget 有函数 但是没有对应的removeWidget QWidget 它只有removeItem QGraphicsItem 如何删除 QWidget 这是一个基本示例 看看
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • 如何使 Python、QT 和 Webkit 在无头服务器上工作?

    我有 Debian Linux 服务器 我用它来做各种事情 我希望它能够完成一些我需要定期完成的网络抓取工作 这段代码可以是在这里找到 http bit ly QeqvzX import sys from PyQt4 QtGui impor
  • Qt5和QML:如何使用WebEngine Quick Nano浏览器自动输入用户名和密码

    我正在使用编写一个小应用程序Qt and QML使用 Qt 文档中的示例WebEngine Quick Nano 浏览器 https doc snapshots qt io qt5 5 9 qtwebengine webengine qui
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • Qt qDebug() 在 Windows shell 中不起作用

    我正在使用一个qDebug Qt 框架的printf屏幕上有东西 当我从 Qt Creator 运行应用程序时它工作得很好 但是当我尝试从 Windows 执行它时cmd它什么也没显示 为什么会发生这种情况 你必须添加 CONFIG con
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • 如何声明一个带有成员函数指针的函数

    我有一个类 其中的成员变量指向库对象 class myClassA private libraryClass libraryObject 该库类发出事件 以字符串为特征 并提供一种机制 允许客户端类指定在发出事件时应调用的成员函数 因此在m
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • 针对初学者的 QT 商业许可证与非商业许可证 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 QT 许可似乎非常反学习 因为据我所知 用它开发的任何东西都只能是商业的当且仅当 its entire开发是在使用商业许可证的情况下完成的
  • Qt 5.1.1 与 Visual Studio 2012 - 这些 QT 版本无法访问

    打开 Visual Studio 时出现此错误 我安装自http qt project org downloads http qt project org downloads 适用于 Windows 64 位的 Qt 5 1 1 VS 20
  • 如何在Android中使用QML - QWebView

    我想在 Android 中部署一个 YouTube 应用程序 但它只能在我的电脑上运行 在安卓上不起作用 它不加载任何视频 问题仅出在 QWebView 上 我使用了与此类似的代码 http doc qt io archives qt 5
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A

随机推荐

  • 受限 CRTP 过早拒绝

    我正在尝试实现一个从基模板继承的派生类 并将派生类作为其模板参数 希望下面的示例能够澄清问题 template
  • 如何在 Windows 8 中重复使用在 Mac 上创建的软链接

    我在 MacBook Pro 中创建的 1000 张图像说 我的软链接很少 我正在 iOS 应用程序中使用它们 现在我正在 Windows 8 手机应用程序中移植相同的应用程序 因此我想在 Windows Phone 8 应用程序中重用相同
  • Java 中使用派生类型作为参数的方法重载

    假设我有现有的代码 我想扩展它 但又想尽可能避免更改它 这段代码周围有一个接收某种类型的方法 Engine method Base b 现在 我想扩展这个功能 因此 我将 Base 扩展为一个名为 Derived 的类型 它包含我需要的更多
  • 如何在 angular2 中应用主题?

    我需要为我在 angular2 中开发的 Web 应用程序提供两个主题 红色 蓝色 当我更改主题时 所有组件都应该反映它吗 在 Angular2 中应用主题的最佳实践是什么 您可以使用文件代币从 angular platform b row
  • JDBCPreparedStatement导致MySQL语法错误

    我收到错误 您的 SQL 语法有错误 请检查与您的 MySQL 服务器版本对应的手册 了解在第 1 行 orderr 附近使用的正确语法 所以我认为错误是我使用了两个 但在我的代码中我没有使用任何 注意该表实际上被命名为 order pub
  • 如何将 cv::MAT 转换为 NHCW 格式?

    在User Guide html中 tensorRT的输入 输出需要使用NCHW格式 什么是 NCHW 格式 如何将 cv MAT 转换为 NCHW 格式 我使用 TensorRT 运行推理 如下代码所示 没有任何错误 但是 这不是正确的输
  • 用于 WPF 富客户端应用程序的图像编辑器组件

    您是否知道可在 WPF 客户端应用程序中使用的简单 NET 组件 该组件具有以下功能 将图像从文件或剪贴板加载到画布中 缩放和移动 定义画布背景颜色 将画布导出为新图像 提前谢谢 普伦森 这些呢 http xdraw codeplex co
  • 使用 asyncio 时无法使用 os.fork() 将多个进程绑定到一个套接字服务器

    我们都知道 使用 asyncio 可以显着提高套接字服务器的性能 如果我们能够利用 cpu 中的所有核心 可能通过多处理模块或os fork etc 我现在正在尝试构建一个多核套接字服务器演示 其中一个异步套接字服务器侦听每个核心并全部绑定
  • 具有相同标识符值的不同对象已与保存时的会话错误相关联[重复]

    这个问题在这里已经有答案了 可能的重复 Spring Hibernate 具有相同标识符值的不同对象已与会话关联 我的休眠注释一直存在问题 我在两个类之间有双向关系 这是映射 感谢axtavt Entity public class Rec
  • PhantomJS:在 REPL 中运行时 page.open() 没有响应

    我试图通过标准输入发送一些 phantomJS 来运行它 但我打开的网页没有响应 这是我尝试执行的 JavaScript require webpage create open http google com function consol
  • 错误:无法读取 null 的属性“close”

    你好 亲爱的社区 我想知道为什么当我尝试使用 mongodb 和 nodejs 时会收到此错误 const MongoClient require mongodb MongoClient MongoClient connect mongod
  • usaco:十三号星期五我的逻辑有什么问题吗?

    该问题要求计算一周中每一天出现的 13 号的数量 这是我的代码 class CopyOffriday public static void main String args throws IOException BufferedReader
  • Spark 在运行 LinearRegressionwithSGD 时未利用所有核心

    我正在本地计算机 16G 8 个 cpu 核心 上运行 Spark 我试图在大小为 300MB 的数据集上训练线性回归模型 我检查了CPU统计信息以及正在运行的程序 它只执行一个线程 文档称他们已经实现了 SGD 的分布式版本 http s
  • 在带有子图的 geopandas 图中添加图例会改变图的大小

    我想用 matplotlib 子图绘制两个 GeoPandas 图 两张地图具有相同的图例 因此我只想有一个图例 但是 如果我向 GeoPandas 图之一添加图例 该图就会变得稍微小一些 这是一个问题 因为这两个图的大小会变得不同 这是我
  • HighlightBrushKey 设置在 Windows 7 中不起作用

    我在资源字典中定义了以下样式
  • 如何将数据组值分配给用 C# 创建的 html 元素?

    我有一个场景 我需要有条件地向上滑动 或隐藏 控件 元素集 我喜欢我找到的答案here来自 QBM5 关于将数据组分配给可以向上滑动的控件 请原谅我的语法 如下所示
  • Socket.IO版本输出

    我升级了套接字 io从 0 9 16 到 1 0 6 并用于输出如下版本 var io require socket io console log Socket IO Version io version 会给我 Socket IO Ver
  • 语法错误:在“<”之前缺少“,”

    很长一段时间后 我才开始用 c 编码 也许我在这里遗漏了一些语法上明显的东西 但我已经搜索了很长时间 但在任何地方都找不到对我的问题的引用 我正在尝试创建一个自定义 C 类set and multiset 这是我的班级cset h prag
  • Glassfish Web 部署后执行代码[重复]

    这个问题在这里已经有答案了 我正在尝试在 Glassfish 上运行 Java Web 服务 有一些初始化代码设置一些变量并从 Glassfish 环境本身检索一些信息 我在 WebService 类内的静态初始化程序中拥有该代码 但是该代
  • Qt QListWidgetItem 多行

    我有一个非常简单的QListWidget对象 我想构建一个文件夹列表 当我将一个项目添加到我的列表中时 我会执行以下操作 void LessCC on addFolderButton clicked QString dirName QFil