Как ограничить длину текста элемента в QListWidgetItem?

Я разрабатываю приложение, которое показывает файлы в определенном каталоге. Все хорошо, кроме текста пункта.

Я использую следующий код для инициализации QListWidget, который показывает значок содержит имя файла и предварительный просмотр:

FlatFSPage::FlatFSPage(QWidget *parent) : QWidget(parent) {
    QVBoxLayout *layout=new QVBoxLayout;

    m_title=new QLabel;
    m_list=new QListWidget;
    layout->addWidget(m_title);
    layout->addWidget(m_list);
    setLayout(layout);

    m_list->setGridSize(QSize(100, 100));
    m_list->setMovement(QListView::Static);
    m_list->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    m_list->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    m_list->setAttribute(Qt::WA_MacShowFocusRect, false);
    m_list->setViewMode(QListView::IconMode);
    m_list->setIconSize(QSize(64, 64));
    m_list->setResizeMode(QListView::Adjust);
    m_list->setUniformItemSizes(true);

}

и использовать

void FlatFSItem::onAddFSItem(QString prefix, QString name) {
    FlatFSPage *page=qobject_cast<FlatFSPage *>(listWidget()->itemWidget(this));
    QListWidget *list=page->m_list;
    QListWidgetItem *item=new QListWidgetItem(list);

    switch(m_type) {
        case ImageFile: {
            item->setIcon(QIcon(":/images/cloud.png"));
            //Use dummy icon first.
            //onUpdateIcon will replace the icon with real preview.

            DelayImageLoader *dli=new DelayImageLoader(this, item, QString("%1/%2").arg(prefix).arg(name));

            QThreadPool::globalInstance()->start(dli);
            break;
        }

        default:
            item->setIcon(QIcon(":/images/cloud.png"));
    }

    item->setText(name);
    item->setTextAlignment(Qt::AlignHCenter);

    int newHeight=list->visualItemRect(item).bottom();
    QSize oldSize=sizeHint(), newSize=QSize(oldSize.width(), newHeight+60);
    QSize satSize;

    setSizeHint(newSize);
    satSize=sizeHint();
}

добавить элемент в элемент управления списком. Чтобы процесс создания предварительного просмотра не блокировал пользовательский интерфейс, я использую пул потоков для подготовки предварительного просмотра. Каждый раз, когда предварительный просмотр готов, поток пользовательского интерфейса получает сигнал (Handler isUpdateIcon) для замены фиктивного значка.

void FlatFSItem::onUpdateIcon(QListWidgetItem *item, QPixmap pixmap) {
    FlatFSPage *page=qobject_cast<FlatFSPage *>(listWidget()->itemWidget(this));
    QListWidget *list=page->m_list;

    bool isItemValid=false;

    for(int i=0;i<list->count();i++) {
        if(list->item(i)==item) {
            isItemValid=true;
            break;
        }
    }

    if(!isItemValid)
        return;

    item->setIcon(QIcon(pixmap));
}

При добавлении элемента с фиктивной иконкой имена файлов идеально обрезаются, чтобы соответствовать ширине элемента. Избыточные строки заменяются на "...". Тем не менее, когда значок обновляется, имя файла больше не обрезается и вызывает элементы покрывают друг друга.

Это ошибка? Как это исправить?

Может кто-нибудь мне помочь?

1 ответ

Что ж, трудно сказать, это может быть вызвано несколькими причинами - новая иконка, размер которой превышает размер 64х64, установленный при инициализации, в другом формате. Есть несколько подходов, которые можно попытаться решить, это:

1) Задержка добавления элемента в виджет, пока изображение не будет загружено

2) Проверьте размер загруженного изображения и измените размер до 64x64, если он превышает его (кстати, какой размер cloud.png?)

Другие вопросы по тегам