QListView selectionModel 不发送 selectionChanged 信号

Posted

技术标签:

【中文标题】QListView selectionModel 不发送 selectionChanged 信号【英文标题】:QListView selectionModel not sending selectionChanged signal 【发布时间】:2016-09-01 03:32:35 【问题描述】:

我有一个带有两个QListViews 的接口,其中左边决定了右边显示的内容:

要更新右侧的列表,我有以下功能:

void CodePlug::handleSelectionChanged()

    QModelIndex portIndex = ui->listPorts->currentIndex();
    QString portItemText = portIndex.data(Qt::DisplayRole).toString();
    ui->listPlugs->setModel(ListModelFromMap(plugs[portItemText]));
    currentPort = portItemText;
    qDebug(currentPort.toStdString().data());

它在这里连接到 selectionChanged 信号:

CodePlug::CodePlug(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::CodePlug)

    ui->setupUi(this);
    ui->listPorts->setModel(ListModelFromMap(ports));
    QModelIndex portIndex = ui->listPlugs->currentIndex();
    QString portItemText = portIndex.data(Qt::DisplayRole).toString();
    ui->listPlugs->setModel(ListModelFromMap(plugs[portItemText]));

    connect(ui->listPorts->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(handleSelectionChanged()));

但是,通过键盘或鼠标更改所选项目永远不会触发handleSelectionChanged()。它不会产生任何错误,它只是不做任何事情。谁能告诉我为什么?

【问题讨论】:

【参考方案1】:

可能的错误:

    您的函数handleSelectionChanged() 是否定义为私有/公共槽? 你的默认SelectionModeQAbstractItemView::NoSelection

尝试强制单选/多选:

ui->listPorts->setSelectionMode(QItemSelectionModel::::SingleSelection)

检查你的 QObject::connect 是否运行良好:

if (!connect(ui->listPorts->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(handleSelectionChanged()))) 
     qDebug() << "Something wrong :(";

【讨论】:

handleSelectionChanged 被定义为一个公共槽,并与其他信号一起使用。默认的 SelectionMode 是 SingleSelection。连接似乎工作正常。 常见问题,请在初始化列表模型后连接信号/插槽。【参考方案2】:

我想通了,这很愚蠢。

当一个新项目被添加到列表中时,我在listPorts 上调用setModel(),这当然断开了连接。我怀疑有更好的方法来处理更改,所以我会尝试修复它,但现在,每次更改模型时我都会重新连接。

【讨论】:

【参考方案3】:

在我看来,连接没问题。您确定没有看到任何运行时错误吗?下面,有几件事可以检查它们是否有帮助。

1) 检查您是否已将 Q_OBJECT 宏添加到您的 CodePlug 类标头。如果没有,添加它并再次运行 qmake。

class CodePlug : public QMainWindow

    Q_OBJECT

2) 检查您是否已将 handleSelectionChanged 定义为插槽。

private slots:
    void handleSelectionChanged();

3) 通过检查 connect 返回的内容来检查它是否真的成功

bool ret = connect(ui->listPorts->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(handleSelectionChanged()));

4) 测试currentChanged 信号是否通过将其连接到例如触发handleCurrentChanged 插槽。

【讨论】:

不幸的是,这些似乎都不是原因。我交替尝试 currentChanged 和 selectionChanged,都返回 true,但都没有触发函数。【参考方案4】:

很可能您没有更改选择,而是更改了当前/活动项目。而是连接到activated(const QModelIndex &amp;index) 信号。

【讨论】:

以上是关于QListView selectionModel 不发送 selectionChanged 信号的主要内容,如果未能解决你的问题,请参考以下文章

Angualr 内置工具-SelectionModel

如何使用 selectionModel 在 QTableView 中选择多行

使用selectionModel获取网格内的复选框值

Qt - 如何将 QListView 项目转移到另一个 QListView?

如何将标题设置为 QListView

如何让QListView显示多列 QTableView与QListView区别在哪里