2017-06-19 11 views
0

の外に行くために選択を引き起こし、素晴らしい人は、問題のためのまともな回避策に私をリードしています。しかし、もっと良い解決策があるかどうかを見極めたいと思っています。実際にはQListWidget内のシフトが完全に防止されます。 http://nexrem.com/test/ListDemo.zipQListWidget水平スクロールバーは、私が以前にこの質問をしたビュー

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

問題zipファイル

ListDemoデモ例の作業

:私は現在、水平スクロールバーと非表示の行とQListWidgetがあるとき 、私が望ましくない動作をするのは、ユーザーがn項目では、ビューから消え、リスト全体がシフトします。 上記の例では、この動作を示すために、1行おきにすべての行を非表示にしています。

回避策: 回避策は、選択された項目をスクロールして表示し、中央に配置する信号スロット接続です。 EnsureVisibleが機能しないので、PositionAtCenterを使用する必要があることに注意してください。それは、アイテムが見えないときに見えると思う。 この回避策は問題ありません。しかし、あなたの選択が強制的に中央に配置されると、目に見える「ジャンプ」があります。これは望ましくない副作用である。私は、これはQTバグが(私はビューのあなたの選択を強制すべきである水平スクロールバーを持つとは思わない)であるか、私のコードは重要な何かが欠けているかどうかを確認していないこの時点で

修正:G.M.さんのコメント@を1として は、欠落していたことすべては

autoScroll propertyを無効にする選択に自動スクロールを防ぐために... myListWidget->setAutoScroll(false);コメントで述べたように

+0

QTバグのように思えます。 Qt 5.9.0、MSVC2015_x64で確認済みです。隠されたアイテムが存在しない場合は発生しません...あなたはQT –

+1

ん[ 'myListWidget-> setAutoScroll(偽)'](http://doc.qt.io/qt-5/qabstractitemview.html#にそれを報告しなければなりませんautoScroll-prop)問題を修正しますか? –

+0

@ G.M。私はそれが単純なものだとは信じられません...しかし、それはありました。それを答えとして投稿してください。 –

答えて

1

です。だから、例のコードでは、あなたのリストビューがドロップサイトとして機能するようにしたい場合は、あなたがするので、項目がリストビュー上にドラッグされている場合、このプロパティにも効果があることを行う...

myListWidget->setAutoScroll(false); 

注意を提供おそらくQDragEnterEventを取得したときにこのプロパティを再度有効にしたいと考えています。

関連する問題