【问题标题】:QItemSelectionModel currentChange signal is emitted on application start?QItemSelectionModel currentChange 信号在应用程序启动时发出?
【发布时间】: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?

【问题讨论】:

    标签: qt qt5 qmainwindow qlistview


    【解决方案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 第一次获得焦点时自动选择的信号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 2011-09-15
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多