qt - 如何在 QLIstWidgetItem 中的文本左侧设置图标?

标签 qt qlistwidget qlistwidgetitem

我有一个 QListWidget,它在 iconMode 中用作 viewMode。当我为 QListWidgetItem 设置 QIcon 和文本时,图标显示在文本的顶部。如果我在 listMode 中使用 QlistWidget 作为 viewMode,图标会显示在文本的左侧。 QListWidget 处于 iconMode 时,如何在文本左侧显示图标?

我为 QLIstWidgetItems 尝试了 setTextAlignment(Qt::AlignRight)。但它没有用。

最佳答案

QStyleOptionViewItem的decorationPosition属性决定了图标的位置,所以解决办法就是修改那些属性:

  • 重写 QListWidget 的 viewOptions() 方法:
#include <QtWidgets>

class ListWidget: public QListWidget
{
public:
    using QListWidget::QListWidget;
protected:
    QStyleOptionViewItem viewOptions() const override{
        QStyleOptionViewItem option = QListWidget::viewOptions();
        option.decorationPosition = QStyleOptionViewItem::Left;
        return option;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ListWidget w;
    w.setViewMode(QListView::IconMode);
    for (QStyle::StandardPixmap sp: {
         QStyle::SP_ArrowBack,
         QStyle::SP_ArrowDown,
         QStyle::SP_ArrowForward,
         QStyle::SP_ArrowLeft,
         QStyle::SP_ArrowRight,
         QStyle::SP_ArrowUp})
    {
        QIcon icon = QApplication::style()->standardPixmap(sp);
        QListWidgetItem *it = new QListWidgetItem("foo");
        it->setIcon(icon);
        w.addItem(it);
    }
    w.show();
    return a.exec();
}
  • 重写 QStyledItemDelegate 的 initStyleOption() 方法
#include <QtWidgets>

class StyledItemDelegate: public QStyledItemDelegate
{
public:
    using QStyledItemDelegate::QStyledItemDelegate;
protected:
    void initStyleOption(QStyleOptionViewItem *option,
                         const QModelIndex &index) const override
    {
        QStyledItemDelegate::initStyleOption(option, index);
        option->decorationPosition = QStyleOptionViewItem::Left;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QListWidget w;
    w.setViewMode(QListView::IconMode);
    StyledItemDelegate *delegate = new StyledItemDelegate(&w);
    w.setItemDelegate(delegate);
    for (QStyle::StandardPixmap sp: {
         QStyle::SP_ArrowBack,
         QStyle::SP_ArrowDown,
         QStyle::SP_ArrowForward,
         QStyle::SP_ArrowLeft,
         QStyle::SP_ArrowRight,
         QStyle::SP_ArrowUp})
    {
        QIcon icon = QApplication::style()->standardPixmap(sp);
        QListWidgetItem *it = new QListWidgetItem("foo");
        it->setIcon(icon);
        w.addItem(it);
    }
    w.show();
    return a.exec();
}

enter image description here

关于qt - 如何在 QLIstWidgetItem 中的文本左侧设置图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56617364/

相关文章:

python - 如何使用 python 和 PyQt5 将目录和文件列表从普通列表转换为树列表

qt - 创建 "pretty"Qt 自定义小部件

c++ - 使用Qt的 `QLowEnergyController`的两个实例连接到两个BLE设备

c++ - 如何在不使应用程序崩溃的情况下使上下文菜单消失?

python - 当QListWidget加载大量图像时,会变得非常慢。有没有办法通过QScrollBar加载?或者,还有更好的方法?

c++ - 使 QListWidget 调整其项目的大小以填充空间

python - 如何使用 QtCore.Qt.UserRole 在 QListWidgetItem 中显示部分粗体文本

c++ - 来自 FBO 的延迟着色器纹理显示为黑色

c++ - Qt C++ |单击 QListWidget 中的项目时,如何获取链接到索引的字符串数据?

c++ - 如何检查 QListWidget 中的所有项目?