尝试在 QListWidget 中进行自动换行和项目

问题描述 投票:0回答:1

我一直在尝试将文本包装在 QListWidget 的项目框中。我的程序是待办事项应用程序。它从 .txt 文件中获取文本并使用它来填充列表小部件:

MainWindow::MainWindow(QWidget *parent):
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

QFile file(path);

if(!file.open(QIODevice::ReadOnly)) {
    QMessageBox::information(0, "error", file.errorString());
}

ui->listWidget_1->setWordWrap(true);
ui->listWidget_1->setStyleSheet("QListView QLineEdit{background:#FFF2D7; 
color:black;}");

QTextStream in(&file);

while(!in.atEnd()) {
    QListWidgetItem *item = new QListWidgetItem(in.readLine(), ui->listWidget_1);
    if(item->checkState())
    {
        item->setCheckState(Qt::Checked);
    }
    else
    {
        item->setCheckState(Qt::Unchecked);
    }

    item->setForeground(QBrush(Qt::black));

    item->setFlags(item->flags() | Qt::ItemIsEditable | Qt::ItemIsUserCheckable);
    ui->listWidget_1->addItem(item);

}

file.close();
}

唯一的问题是,当文本太长时,它会创建一个水平滚动条并且不会换行文本,但我希望它换行。我知道我的 if(item->checkState()) 目前什么也没做,但它就在那里,因为有一天我想用它做点什么。有谁知道如何使物品真正包裹起来?我读了很多关于代表和 Paint() 的内容,但我似乎不知道如何将它应用到我的函数中。

c++ qt qt6 qlistwidget
1个回答
0
投票

当您激活自动换行时,

QListWidget
中的项目实际上会自动增长,就像您所做的那样。

以下为示范:

#include <QtWidgets/QListWidget>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QListWidget l;
    l.setWordWrap(true);
    QString words = QString::fromWCharArray(L"ABC DEF GHI JKL MNO PQR STU VWX YZ");
    for (int i = 0; i < 27; ++i) {
        QListWidgetItem* item = new QListWidgetItem(words.left(i + 1 + i / 3), &l);
        item->setCheckState(i & 1 ? Qt::Checked : Qt::Unchecked);
        l.addItem(item);
    }
    l.show();

    return a.exec();
}

正如我所说,其结果是:
Word wrapping

如果您密切关注动画 gif,您可能会注意到有些单词实际上没有换行到下一行。
线索隐藏在我对

QString::fromWCharArray
的调用中:我重用的字符串中的前几个空格实际上是不间断空格而不是常规空格,并且小部件的行为相应地不会在不间断空格上断行。

关于您的问题,要么您的文件包含此类不间断空格(如果您不期望它们,您需要确保情况并非如此),要么您正在代码的另一个位置(包括 ui 文件)执行某些操作覆盖

QListWidget
的默认行为。

© www.soinside.com 2019 - 2024. All rights reserved.