QItemSelectionModel currentChange信号在应用程序启动时发出



所以我有一个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?

[怎么了?])

由于listViewQMainWindow中唯一的小部件,它将在应用程序启动时自动聚焦。一旦listView聚焦,如果没有当前项,则第一个项自动成为当前项。因此发出了信号。

(解决方案)

选项1

在应用程序中添加其他小部件,并调用其中一个小部件 QWidget::setFocus ,使其成为应用程序启动时的默认焦点小部件。

选项2

调用 QListView::setFocusPolicy 并使其为 Qt::ClickFocus ,因此listView仅在单击其中一个项目时才会集中。

选项3

信号 QItemSelectionModel::currentChanged 有两个参数:QModelIndex &currentQModelIndex &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第一次聚焦时自动选择发出的信号。

相关内容

  • 没有找到相关文章

最新更新