2017-06-19 235 views
0

我以前問過這個問題,一個很棒的人讓我對這個問題有一個體面的解決方法。不過,我希望看看是否有更好的解決方案。一個實際上阻止我的QListWidget完全轉移。QListWidget水平滾動條導致選擇離開視圖

工作演示的例子

ListDemo zip文件 http://nexrem.com/test/ListDemo.zip

ListDemo cpp的代碼

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

    myListWidget = new QListWidget(); 

    /* 
    * The signal-slot below is a temporary workaround for the shifting issue. 
    * This will ensure that the item selected remains in view, 
    * This is achieved by forcing the item to be in the center of the window; 
    * however, this has an undesired side-effect of visible 'jumping' as the list 
    * scrolls to center the item. 
    */ 
    //connect (myListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, 
    //   SLOT(scrollToItem(QListWidgetItem*))); 

    for (int i = 0; i <= 1000; ++i) 
    { 
     QListWidgetItem * myItem = new QListWidgetItem(myListWidget); 
     QString text(""); 
     for (int i = 0; i <= 40; ++i) 
     { 
      text.append("W"); 
     } 
     myItem->setText(text + QString::number(i)); 
    } 

    for (int i = 0; i <= 1000; ++i) 
    { 
     if (i%2) 
      myListWidget->item(i)->setHidden(true); 
    } 
    auto selected = myListWidget->selectedItems(); 
    if (selected.size() == 1) 
    { 
     myListWidget->scrollToItem(selected.front()); 
    } 
    setCentralWidget(myListWidget); 
} 


void MainWindow::scrollToItem(QListWidgetItem * item) 
{ 
    std::cout << "Scrolling to the item." << std::endl; 
    myListWidget->scrollToItem(item, QAbstractItemView::PositionAtCenter); 
} 

問題: 每當我有一個QListWidget與當前水平滾動條和隱藏的行,每當用戶點擊某個按鈕時,我都會受到不希望的行爲n項目,它從視圖中消失,整個列表向下移動。 在上面的示例中,我隱藏了其他每一行,以演示此行爲。

解決方法: 解決方法是使信號插槽連接強制將選定項滾動回視圖並定位在中心位置。 請注意,我必須使用PositionAtCenter作爲EnsureVisible不起作用。它認爲該物品在視線之外時是可見的。 此變通辦法是可以接受的;然而,當你的選擇被迫定位在中心時,有可見的'跳躍'。這是一個不良的副作用。

在這一點上,我不確定這是否是一個QT錯誤(我認爲水平滾動條不應該強制你的選擇離開視圖),或者我的代碼缺少一些重要的東西。

解決方法: 按@ G.M.的評論,所有的失蹤是myListWidget->setAutoScroll(false);

+0

看起來像一個QT錯誤。通過Qt 5.9.0,MSVC2015_x64進行了確認。如果沒有隱藏的項目,則不會發生...您應該向QT報告 –

+1

[[myListWidget-> setAutoScroll(false)'](http://doc.qt.io/qt-5/qabstractitemview.html# autoScroll-prop)修復這個問題? –

+0

@ G.M。我不敢相信這件事很簡單......但事實確實如此。請將其作爲答案發布。 –

回答

1

正如在評論中提及...

爲了防止自動滾屏上選擇禁用autoScroll property。因此,在示例代碼提供做...

myListWidget->setAutoScroll(false); 

注意,該酒店還擁有在將項目拖到列表視圖,所以如果你想讓你的列表視圖充當下降網站,那麼你會產生影響可能要在您獲得QDragEnterEvent時重新啓用此屬性。