键盘操作导致QListView选择更改时如何发出信号?

20
我有一个使用QT Designer创建的QDialog,如下图所示:Dialog 左侧服务器列表是一个QStringListModel的QListView。通过将视图的activated(QModelIndex)信号连接到对话框中的一个槽函数,单击列表视图中的项目会更新选定项目的信息。
但是,按键盘上的向上或向下箭头也会更改所选项目,但不会发出信号,因此表单不会更新以匹配所选项目。该如何解决?
3个回答

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() 应该替换为当没有选择任何内容时您想要执行的操作。
有很多方法可以实现这个功能,老实说我不确定哪种是标准的,但我认为这对您来说会起作用。

你在头文件中声明它时,是否将其放在了private slots:下面? - cgmb
1
我建议使用currentChanged()信号而不是selectionChanged()。这应该为您提供更清晰的解决方案,因为您不需要支持多个选择。 - Dmitry Volosnykh
@DmitryVolosnykh 没有这样的信号。 - Nikos C.
1
@NikosC。我认为他指的是QItemSelectionModel::currentChanged - cgmb
1
这个概念相当模糊,但更像是明确选择的行为 - activate 是双击的通用版本,包括键盘等效操作(按 Enter 键)。 - Jason S
显示剩余2条评论

0
另一种方法是实现QListView::currentChanged(...)虚函数。

0

我在使用Qt6时也遇到了类似的问题。除了已经被接受的答案,我还提出了这个解决方案,使用新的语法,它变成了(例如未经测试):

MyView::MyView() {
   QListView* view = new QListView(this);
   connect(view->selectionModel(), 
      &QItemSelectionModel::currentChanged, 
      this, &MyView::handleSelectionChanged);
}

...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接