首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QListView selectionModel不发送selectionChanged信号

QListView selectionModel不发送selectionChanged信号
EN

Stack Overflow用户
提问于 2016-09-01 03:32:35
回答 4查看 2.6K关注 0票数 3

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

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

代码语言:javascript
复制
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信号相连:

代码语言:javascript
复制
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()。它不会产生任何错误,它只是什么都不做。有人能告诉我为什么吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-02 03:56:59

我想出来了,这太傻了。

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

票数 3
EN

Stack Overflow用户

发布于 2016-09-01 07:09:24

可点错误:

  1. 您的函数handleSelectionChanged()是否定义为私有/公共时隙?
  2. 是默认的SelectionMode QAbstractItemView::NoSelection吗?

尝试强制一个/多个选择:

代码语言:javascript
复制
ui->listPorts->setSelectionMode(QItemSelectionModel::::SingleSelection)

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

代码语言:javascript
复制
if (!connect(ui->listPorts->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(handleSelectionChanged()))) 
     qDebug() << "Something wrong :(";
票数 2
EN

Stack Overflow用户

发布于 2016-09-01 06:59:00

在我看来连接还不错。您确定没有看到任何运行时错误?下面,很少有东西可以检查它们是否有帮助。

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

代码语言:javascript
复制
class CodePlug : public QMainWindow
{
    Q_OBJECT

2)检查是否将handleSelectionChanged定义为一个槽。

代码语言:javascript
复制
private slots:
    void handleSelectionChanged();

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

代码语言:javascript
复制
bool ret = connect(ui->listPorts->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(handleSelectionChanged()));

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39262284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档