2014-10-20 124 views
0

我正在開發一個應用程序來顯示某些目錄中的文件。 一切都很好,除了項目文本。如何限制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(); 
} 

追加項目列表控件。 爲了防止預覽製作過程阻止用戶界面,我使用線程池來準備預覽。每次預覽準備就緒時,UI線程都會收到一個信號(Handler 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)); 
} 

雖然與附加虛擬圖標項,文件名是完全修剪,以適應項目的寬度。冗餘字符串被替換爲「...」。但是,當圖標被更新時,文件名不再被修剪並導致項目彼此覆蓋。

這是一個錯誤?如何解決它?

任何人都可以幫助我嗎?

回答

0

嗯,很難說,可能有幾個原因導致這種情況 - 新圖標超過了您在初始化時設置的64x64大小,不同的格式。有一對夫婦的做法可能被試圖解決這個問題:

1)延遲添加項目到小部件,直到圖像實際加載

2)驗證加載圖像的大小和調整到64x64如果它超過了(順便說一下,什麼尺寸是cloud.png?)

+0

1.我無法添加該項目,直到圖像實際加載。首先添加虛擬圖標,稍後更新是必需的。 2. cloud.png是128 by 128. 3.我試過QListWidgetItem :: setSizeHint()與網格大小相同......問題似乎消失了......但我不知道如何...... – 2014-10-20 09:37:23

+0

嗯,這意味着如果網格大小爲100乘100,圖標64乘64,那麼雲PNG實際上是在縮小的情況下,如果它沒有超過邊界的權利? – 2014-10-20 09:48:58

+0

是的,我認爲是。 – 2014-10-20 10:16:23

相關問題