qt qlistwidget

问题:如何让item显示图片在上面文字在下面
问题二:每个item之间如何添加中间分隔符号

img

基于new bing部分指引作答:

  1. 要实现在 Qt 中让 item 显示图片在上方,文字在下方,你可以使用一个垂直布局(QVBoxLayout)来容纳图片和文字。首先,将图片和文本创建为相应的控件,例如 QLabel 和 QPixmap,然后将它们添加到一个垂直布局中,以确保它们水平居中对齐。

下面是一个简单的示例代码片段:

QLabel *imageLabel = new QLabel();
QPixmap pixmap("your_image_path.png"); // 替换为你的图片路径
imageLabel->setPixmap(pixmap.scaledToWidth(100)); // 根据需要设置图片大小

QLabel *textLabel = new QLabel("Your Text");

QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(imageLabel, 0, Qt::AlignHCenter);  // 图片居中对齐
layout->addWidget(textLabel, 0, Qt::AlignHCenter);   // 文本居中对齐

QWidget *itemWidget = new QWidget();
itemWidget->setLayout(layout);

// 将 itemWidget 添加到你的容器或布局中显示
  1. 要在每个项之间添加中间分隔符号,在 Qt 中可以使用样式表(StyleSheet)来实现。你可以在项的布局容器上设置一个边框或分隔线的样式。

下面是一个示例代码片段,演示如何在每个项之间添加水平分隔线:

QVBoxLayout *layout = new QVBoxLayout();

// 添加第一个 item 控件...

// 添加分隔线
QFrame *line = new QFrame();
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
layout->addWidget(line);

// 添加第二个 item 控件...

// 添加分隔线
line = new QFrame();
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
layout->addWidget(line);

// 依此类推,添加其他项控件和分隔线

QWidget *containerWidget = new QWidget();
containerWidget->setLayout(layout);

// 将 containerWidget 添加到你的布局或窗口中显示

通过以上方法,你可以在每个项之间添加分隔线来增加可视区分。你还可以根据需要修改分隔线的样式以满足你的设计需求。

  • 你可以参考下这篇文章:QListWidget删除Item时的相关问题
  • 同时,你还可以查看手册:qt QListWidget 中的内容
  • 除此之外, 这篇博客: Qt QListWidget详解中的 四、显示其他控件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 可以显示Qt原生控件,也可以自定义控件,进行添加显示。

    	//显示QLineEdit控件
    	QLineEdit *lineEdit = new QLineEdit(QString::fromLocal8Bit("显示控件001"));
    	ui.listWidget->setItemWidget(ui.listWidget->item(2), lineEdit);
    
  • 您还可以看一下 明仕强老师的Qt高级开发视频教程课程中的 QListWidget用法(二):右键菜单、item删除小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    使用QListWidgetItem的setTextAlignment函数可以设置文本的对齐方式,将文本对齐到下方,代码如下:

    //创建item
    QListWidgetItem* it1 = new QListWidgetItem(QIcon(":/resources/user.png"), u8"用户1");
    it1->setTextAlignment(Qt::AlignHCenter | Qt::AlignBottom); //设置文本对齐方式
    

    添加分隔符的方法,可以利用setItemDelegate函数设置itemDelegate,然后在paint函数中绘制分隔符,代码如下:

    //自定义itemDelegate
    class MyItemDelegate : public QStyledItemDelegate
    {
    public:
        void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
        {
            QStyledItemDelegate::paint(painter, option, index);
            if (index.row() < index.model()->rowCount()-1) //不是最后一行
            {
                painter->setPen(Qt::gray);
                painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
            }
        }
    };
    
    //设置itemDelegate
    ui->listWidget->setItemDelegate(new MyItemDelegate());
    

    最终的代码示例如下:

    //创建item
    QListWidgetItem* it1 = new QListWidgetItem(QIcon(":/resources/user.png"), u8"用户1");
    it1->setTextAlignment(Qt::AlignHCenter | Qt::AlignBottom); //设置文本对齐方式
    QListWidgetItem* it2 = new QListWidgetItem(QIcon(":/resources/user.png"), u8"用户2");
    it2->setTextAlignment(Qt::AlignHCenter | Qt::AlignBottom);
    QListWidgetItem* it3 = new QListWidgetItem(QIcon(":/resources/user.png"), u8"用户3");
    it3->setTextAlignment(Qt::AlignHCenter | Qt::AlignBottom);
    QListWidgetItem* it4 = new QListWidgetItem(QIcon(":/resources/user.png"), u8"用户4");
    it4->setTextAlignment(Qt::AlignHCenter | Qt::AlignBottom);
    QListWidgetItem* it5 = new QListWidgetItem(QIcon(":/resources/user.png"), u8"用户5");
    it5->setTextAlignment(Qt::AlignHCenter | Qt::AlignBottom);
    
    //添加item
    ui->listWidget->addItem(it1);
    ui->listWidget->addItem(it2);
    ui->listWidget->addItem(it3);
    ui->listWidget->addItem(it4);
    ui->listWidget->addItem(it5);
    
    //自定义itemDelegate
    class MyItemDelegate : public QStyledItemDelegate
    {
    public:
        void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
        {
            QStyledItemDelegate::paint(painter, option, index);
            if (index.row() < index.model()->rowCount()-1) //不是最后一行
            {
                painter->setPen(Qt::gray);
                painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
            }
        }
    };
    
    //设置itemDelegate
    ui->listWidget->setItemDelegate(new MyItemDelegate());