LINUX.ORG.RU

Я туплю. Коннект не хочет работать.

 , , , ,


0

1

Сделал примитивный класс, унаследованный от QTreeView:

ShortcutSettingsView.h

class ShortcutSettingsView : public QTreeView
{
    Q_OBJECT
public:
    ShortcutSettingsView(QWidget *parent=nullptr);

protected slots:
    void onCurrentChanged(const QModelIndex &index);
};

ShortcutSettingsView.cpp
ShortcutSettingsView::ShortcutSettingsView(QWidget *parent) : QTreeView(parent)
{
    connect(this, &ShortcutSettingsView::currentChanged,
            this, &ShortcutSettingsView::onCurrentChanged);
}

void ShortcutSettingsView::onCurrentChanged(const QModelIndex &index)
{
    qDebug() << "Replace cursor position to 0 column";

    this->setCurrentIndex( index.siblingAtColumn(0) );
}

Коннект прописан в новом стиле, который вроде как должен исключать ошибки. Компиляция идет без ошибок и варнингов. Но в момент работы слот не отрабатывает, а в консоли видно:
17:45:30 [WRN] QObject::connect: signal not found in ShortcutSettingsView

Это что за? Как заставить работать коннект? Полная пересборка не помогает (думал, moc_* не обновился).

★★★★★

Ответ на: комментарий от dib2

connect(this, &QTreeView::currentChanged,
this, &ShortcutSettingsView::onCurrentChanged);

Нет, так не компилится:

../../MyTetraSrc/app/src/views/shortcutSettings/ShortcutSettingsView.cpp:
In constructor ‘ShortcutSettingsView::ShortcutSettingsView(QWidget*)’:
../../MyTetraSrc/app/src/views/shortcutSettings/ShortcutSettingsView.cpp:15:31: 
error: ‘virtual void QTreeView::currentChanged(const QModelIndex&, const QModelIndex&)’ is protected within this context
     connect(this, &QTreeView::currentChanged,
                               ^~~~~~~~~~~~~~
In file included from /opt/qt_5_11_2/5.11.2/gcc_64/include/QtWidgets/QTreeView:1:0,
                 from ../../MyTetraSrc/app/src/views/shortcutSettings/ShortcutSettingsView.h:4,
                 from ../../MyTetraSrc/app/src/views/shortcutSettings/ShortcutSettingsView.cpp:1:
/opt/qt_5_11_2/5.11.2/gcc_64/include/QtWidgets/qtreeview.h:222:10: note: declared protected here
     void currentChanged(const QModelIndex &current, const QModelIndex &previous) override;

Xintrea ★★★★★ ()
Ответ на: комментарий от dib2

А встроенный синтаксический анализатор показывает такую ошибку:

ShortcutSettingsView.cpp:15: ошибка: 'currentChanged' is a protected member of 'QTreeView'
/opt/qt_5_11_2/5.11.2/gcc_64/include/QtWidgets/qtreeview.h:222: must name member using the type of the current context 'ShortcutSettingsView'

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

А почему я затупил? А потому что у QItemSelectionModel есть selectionChanged, и это сигнал. Похожий по имени метод currentChanged у QTreeView - это слот. Видимо, тут используется симметрия имен - то что у модели называют сигналом, у вида - это слот.

Xintrea ★★★★★ ()

В моем случае, для реакции на движение курсора по дереву (горизонтальной линии на ширину всего дерева), надо пользоваться сигналом currentRowChanged() от selectionModel():

connect(this->selectionModel(), &QItemSelectionModel::currentRowChanged,
        this, &ShortcutSettingsView::onCurrentChanged);

Однако есть одна тонкость: этот коннект нельзя прописывать в конструкторе вида. Потому что указатель this->selectionModel() не определен, пока не установлена модель через метод setModel():
10:41:30 [WRN] QObject::connect: invalid null parameter

И что неудобно, у вида нет сигнала типа onSetModel(), поэтому приходится выделять создание коннекта в отдельный метод, и в создающем объект коде (в моем случае в контроллере) писать для вида сначала setModel(), а потом вызов метода установки сигналов-слотов.

Xintrea ★★★★★ ()