【问题标题】:How to limit item text length in QListWidgetItem?如何限制 QListWidgetItem 中的项目文本长度?
【发布时间】:2014-10-20 07:55:35
【问题描述】:

我正在开发一个显示特定目录中文件的应用程序。 一切都很好,除了项目文本。

我使用以下代码初始化 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();
}

将项目附加到列表控件。 为了防止预览制作过程阻塞 UI,我使用线程池来准备预览。每次预览准备好时,UI 线程都会收到一个信号(Handler 为 onUpdateIcon)来替换虚拟图标。

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));
}

在添加带有虚拟图标的项目时,文件名会被完美地修剪以适合项目的宽度。冗余字符串被替换为“...”。但是,在更新图标时,文件名不再被修剪,导致项目相互覆盖。

这是一个错误吗?如何解决?

谁能帮帮我?

【问题讨论】:

    标签: qt user-interface qlistwidget


    【解决方案1】:

    嗯,很难说,这可能有几个原因 - 新图标超过了您在初始化时设置的 64x64 大小,不同的格式。有几种方法可以尝试解决这个问题:

    1) 延迟将项目添加到小部件,直到实际加载图像

    2) 验证加载图像的大小,如果超过则调整为 64x64(顺便说一句,cloud.png 的大小是多少?)

    【讨论】:

    • 1.在实际加载图像之前,我无法添加该项目。首先添加虚拟图标,稍后更新是必需的。 2. cloud.png 是 128 x 128。 3. 我尝试了与网格大小相同的 QListWidgetItem::setSizeHint()...问题似乎消失了...但我不知道如何...
    • 嗯,这意味着如果网格大小是 100 x 100 和图标 64 x 64,那么如果它没有超出边界,那么云 png 实际上是按比例缩小的,对吧?
    • 好吧,您在加载图像后更新图像的代码不包含setSizeHint() 调用,请尝试在那里也这样做,也许这就是触发缩小的原因。
    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多