QItemSelectionModel currentChange 信号在应用程序启动时发出?
Posted
技术标签:
【中文标题】QItemSelectionModel currentChange 信号在应用程序启动时发出?【英文标题】:QItemSelectionModel currentChange signal is emitted on application start? 【发布时间】:2014-07-05 15:32:06 【问题描述】:所以我有一个 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,在我真正点击 ListView 之前如何避免发出 currentChanged?
【问题讨论】:
【参考方案1】:[怎么了?]
由于 listView 是您的QMainWindow
中唯一的小部件,因此在应用程序启动时它会自动聚焦。一旦 listView 获得焦点,如果还没有当前项目,第一个项目将自动成为当前项目。因此发出的信号。
[解决方案]
选项 1
将其他小部件添加到您的应用程序中,并在其中一个上调用QWidget::setFocus
,使其成为应用启动时的默认焦点小部件。
选项 2
调用QListView::setFocusPolicy
并设置为Qt::ClickFocus
,这样listView 只有在其中一项被点击时才会被聚焦。
选项 3
信号QItemSelectionModel::currentChanged
实际上有两个参数:QModelIndex &current
和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 第一次获得焦点时自动选择的信号。
【讨论】:
以上是关于QItemSelectionModel currentChange 信号在应用程序启动时发出?的主要内容,如果未能解决你的问题,请参考以下文章
QItemSelectionModel currentChange 信号在应用程序启动时发出?