所以我有一个QMainWindow,在它的构造函数中我做了以下事情:
QStringList stringList;
stringList << "aaa" << "bbb" << "ccc";
QStringListModel *list = new QStringListModel(stringList);
ui->listView->setModel(list);
stringList.append("ddd");
list->setStringList(stringList);
QObject::connect(ui->listView->selectionModel(), &QItemSelectionModel::currentChanged, [&]() {
//do stuff
});
为什么在应用程序启动时发出currentchanged,以及我如何避免发出currentchanged,直到我实际单击ListView?
[怎么了?])
由于listView是QMainWindow
中唯一的小部件,它将在应用程序启动时自动聚焦。一旦listView聚焦,如果没有当前项,则第一个项自动成为当前项。因此发出了信号。
选项1
在应用程序中添加其他小部件,并调用其中一个小部件 QWidget::setFocus
,使其成为应用程序启动时的默认焦点小部件。
选项2
调用 QListView::setFocusPolicy
并使其为 Qt::ClickFocus
,因此listView仅在单击其中一个项目时才会集中。
选项3
信号 QItemSelectionModel::currentChanged
有两个参数:QModelIndex ¤t
和QModelIndex &privious
。通过传统的信号/插槽连接使用它们。例如
connect(ui->listView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(yourSlot(QModelIndex, QModelIndex)));
在插槽中:
void MainWindow::yourSlot(QModelIndex cur, QModelIndex pre)
{
if(pre.isValid()) {
// do stuff
}
}
注:pre
无效表示之前没有当前项。这就绕过了listView第一次聚焦时自动选择发出的信号。