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 &amp;currentQModelIndex &amp;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 信号在应用程序启动时发出?的主要内容,如果未能解决你的问题,请参考以下文章

QT QItemSelectionModel 忽略列?

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

链表

javascript MUL-的 - 瓦尔斯 - 除了-CURR

在犰狳的vec后面推元素

C ++按日期排序链表