Qt 如何限制QListWidgetItem中的项目文本长度?
我正在开发一个应用程序,显示特定目录中的文件。 一切都很好,除了项目文本 我使用以下代码初始化QListWidget,它显示包含文件名和预览的图标:Qt 如何限制QListWidgetItem中的项目文本长度?,qt,user-interface,qlistwidget,Qt,User Interface,Qlistwidget,我正在开发一个应用程序,显示特定目录中的文件。 一切都很好,除了项目文本 我使用以下代码初始化QListWidget,它显示包含文件名和预览的图标: FlatFSPage::FlatFSPage(QWidget *parent) : QWidget(parent) { QVBoxLayout *layout=new QVBoxLayout; m_title=new QLabel; m_list=new QListWidget; layout->addWid
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线程都会收到一个信号处理程序is 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));
}
在附加带有虚拟图标的项目时,文件名会被完美地修剪以适合项目的宽度。冗余字符串替换为。。。。但是,当更新图标时,文件名不再被修剪,并导致项目相互覆盖
是虫子吗?如何修复它
有人能帮我吗?好吧,很难说,可能有两个原因导致了这种情况-新图标超过了初始化时设置的64x64大小,格式不同。有几种方法可以尝试解决这个问题: 1延迟将项目添加到小部件,直到图像实际加载
2验证加载图像的大小,如果超过64x64,则将其调整为64x64。顺便问一下,cloud.png的大小是多少?1。在图像实际加载之前,我无法添加项目。首先添加虚拟图标,然后更新是必需的。2.cloud.png是128乘128。3.我尝试了与网格大小相同的QListWidgetItem::setSizeHint…问题似乎消失了…但我不知道如何解决…嗯,这意味着如果网格大小为100 x 100,图标大小为64 x 64,那么如果没有超出边界,云png实际上正在缩小,对吗,加载图像后更新图像的代码不包含setSizeHint调用,请尝试在那里也这样做,这可能是触发缩小规模的原因。