QListView selectionModel不发送selectionChanged信号

时间:2016-09-01 03:32:36

标签: c++ qt listview signals

我有两个QListViews的界面,其中左边确定了右边显示的内容: layout

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

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()。它不会产生任何错误,它只是没有做任何事情。有谁能问我为什么?

4 个答案:

答案 0 :(得分:1)

连接对我来说没问题。您确定没有看到任何运行时错误?下面,几乎没有什么可以检查它们是否有用。

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 slot。

答案 1 :(得分:1)

可疑错误:

  1. 您的函数handleSelectionChanged()是否定义为私有/公共广告位?
  2. 您的默认SelectionMode QAbstractItemView::NoSelection
  3. 尝试强制进行单个/多个选择:

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我弄明白了,这很愚蠢。

当一个新项目被添加到列表中时,我在setModel()上呼叫listPorts,这当然打破了连接。我怀疑有更好的方法来处理这个变化,所以我会尝试解决这个问题但是现在,每次模型改变时我都会重新连接。