19

私は QT Designer で作成された QDialog を持っています。ダイアログ

左側のサーバーのリストは、QStringListModel を持つ QListView です。リスト ビュー内のアイテムをマウスでクリックすると、ビューの activate(QModelIndex) シグナルをダイアログ内のスロット関数に接続することにより、選択したアイテムの情報でフォームが更新されます。

ただし、キーボードを上または下に押すと、選択されたアイテムも変更されますが、信号は送信されないため、フォームは選択されたアイテムに一致するように更新されません。これはどのように修正できますか?

4

2 に答える 2

32

信号は、activated(QModelIndex)実際には、選択するという行為以上のものを指します。概念はかなり曖昧ですが、それは明示的な選択の行為のようなものです。現在の選択が変更されたという通知を探しているだけの場合は、選択モデルを取得して、その更新に接続できます。

MyView::MyView() {
   QListView* view = new QListView(this);
   connect(view->selectionModel(), 
      SIGNAL(selectionChanged(QItemSelection,QItemSelection)), 
      this, SLOT(handleSelectionChanged(QItemSelection)));
}

...

MyView::handleSelectionChanged(const QItemSelection& selection){
   if(selection.indexes().isEmpty()) {
      clearMyView();
   } else {
      displayModelIndexInMyView(selection.indexes().first());
   }
}

上記のコードでdisplayModelIndexInMyView(QModelIndex)は、の現在のハンドラスロットにactivated(QModelIndex)置き換えclearMyView()、何も選択されていないときに実行したいものに置き換えます。

これを行うには多くの方法があり、正直なところ、正規の方法が何であるかはわかりませんが、これはあなたにとってうまくいくと思います。

于 2013-03-05T02:49:48.130 に答える