Функция слота не вызывается сигналом currentChanged treeView

Я хочу вызвать функцию indexChanged() при изменении индекса в моем дереве. Я использовал сигнал ui->treeView->currentChanged(), но он не вызывал слот indexChanged(), хотя я подключил сигнал к слоту.

Вот мой код:

.cpp-файл

TipManager::TipManager(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TipManager)
{
    ui->setupUi(this);

    connect(ui->treeView->selectionModel(), &QItemSelectionModel::currentChanged, this, &TipManager::indexChanged);

    ...
}

void TipManager::indexChanged(const QModelIndex &current, const QModelIndex &previous)
{
    trimCurrentPath(previous); 
}

.h файл

namespace Ui {
class TipManager;
}

class TipManager : public QWidget
{
    Q_OBJECT

public:
    explicit TipManager(QWidget *parent = 0);
    ~TipManager();

public slots:
    void indexChanged(const QModelIndex &current, const QModelIndex &previous);

private:
    Ui::TipManager *ui;  
    ...
};

Я также тестировал в режиме отладки, но функция слота indexChanged() даже не вызывается. Кроме того, вместо этого отображается это сообщение: QObject::connect: неверный нулевой параметр


person Sean    schedule 26.06.2018    source источник
comment
Вам нужно идентифицировать параметр null, о котором сообщает сообщение об ошибке — я предполагаю, что это значение, возвращаемое QTreeView::selectionModel(). Кроме того, если вы просто хотите получить уведомление об изменении текущего индекса QTreeView, вы можете изменить свой код на connect(ui->treeView, &QTreeView::currentChanged, ...).   -  person G.M.    schedule 26.06.2018
comment
@G.M. Я не могу назвать &QTreeView::currentChanged вот так connect(ui->treeView, &QTreeView::currentChanged, ...), потому что он защищен.   -  person Sean    schedule 26.06.2018
comment
Извините, я неправильно прочитал документацию. Но поскольку QTreeView::currentChanged является виртуальным защищенным элементом, вы всегда можете переопределить его. в подклассе и выполнять там необходимые действия.   -  person G.M.    schedule 26.06.2018
comment
@G.M. в этой строке конструктора connect(ui->treeView, &QTreeView::currentChanged, this, &TipManager::indexChanged); появляется это сообщение - ошибка: 'virtual void QTreeView::currentChanged(const QModelIndex&, const QModelIndex&)' защищен   -  person Sean    schedule 26.06.2018
comment
QTreeView::currentChanged не сигнал, поэтому вы не можете connect к нему. Это обычная функция-член virtual, поэтому вам нужно определить класс, наследуемый от QTreeView, и переопределить член currentChanged, как и любой другой член virtual.   -  person G.M.    schedule 26.06.2018
comment
@G.M. Я бы хотел сделать так. Но поскольку я использовал интерфейс .ui, я не нашел, как это сделать.   -  person Sean    schedule 26.06.2018


Ответы (1)


Я столкнулся с похожей проблемой (слот не запускался). Следуя указателю @G.M. в комментариях к вашему вопросу, оказалось, что вызов ui-›treeView-›selectionModel() возвращает null, если модели еще нет (и setSelectionModel() еще не вызывался, предположительно) .

Если бы я заполнил свой QTreeView до вызова ui-›treeView-›selectionModel() в вызове connect(), то я получил свой ненулевой ответ, и слот был запущен сигналом по желанию.

person eff    schedule 17.05.2021