我有一个使用QT Designer创建的QDialog,如下图所示:
左侧服务器列表是一个QStringListModel的QListView。通过将视图的activated(QModelIndex)信号连接到对话框中的一个槽函数,单击列表视图中的项目会更新选定项目的信息。
但是,按键盘上的向上或向下箭头也会更改所选项目,但不会发出信号,因此表单不会更新以匹配所选项目。该如何解决?
![Dialog](https://istack.dev59.com/CtfrF.webp)
但是,按键盘上的向上或向下箭头也会更改所选项目,但不会发出信号,因此表单不会更新以匹配所选项目。该如何解决?
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()
应该替换为当没有选择任何内容时您想要执行的操作。QListView::currentChanged(...)
虚函数。我在使用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());
}
}
private slots:
下面? - cgmbcurrentChanged()
信号而不是selectionChanged()
。这应该为您提供更清晰的解决方案,因为您不需要支持多个选择。 - Dmitry VolosnykhQItemSelectionModel::currentChanged
。 - cgmbactivate
是双击的通用版本,包括键盘等效操作(按 Enter 键)。 - Jason S