Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Medved от Август 01, 2022, 15:01



Название: Connect не работает
Отправлено: Medved от Август 01, 2022, 15:01
Кто-нибудь сможет объяснить почему вот так работает:

Код:
   // pMainMenu = new QMenuBar()
    QAction* pAction = pMainMenu->myAction(); // new QAction
    connect(pAction, &QAction::triggered, this, &MainWindow::openMyWindow);

... а вот так НЕ работает?

Код:
   // pMainMenu = new QMenuBar()
    QAction* pAction = pMainMenu->myAction(); // new QAction
    connect(pAction, SIGNAL(pAction->triggered(bool)), this, SLOT(openMyWindow()));

внутри метода connect MOC не может найти сигнал во втором случае.


Название: Re: Connect не работает
Отправлено: vbv от Август 01, 2022, 17:13
Все дело в параметрах.
В сигнале и слоте не совпадают параметры.


Название: Re: Connect не работает
Отправлено: Medved от Август 01, 2022, 18:26
Все дело в параметрах.
В сигнале и слоте не совпадают параметры.

Код:
connect(pAction, SIGNAL(pAction->triggered(bool)), this, SLOT(openMyWindow(bool)));

также не работает... не может найти сигнал triggered по какой-то причине.


Название: Re: Connect не работает
Отправлено: ssoft от Август 01, 2022, 18:30

Код:
connect(pAction, SIGNAL(triggered(bool)), this, SLOT(openMyWindow()));


Название: Re: Connect не работает
Отправлено: vbv от Август 01, 2022, 20:11

Код:
connect(pAction, SIGNAL(triggered(bool)), this, SLOT(openMyWindow()));


Точно, не досмотрел.


Название: Re: Connect не работает
Отправлено: Medved от Август 02, 2022, 12:20

Код:
connect(pAction, SIGNAL(triggered(bool)), this, SLOT(openMyWindow()));


не работает...

Код:
connect(pAction, SIGNAL(triggered(bool)), this, SLOT(openMyWindow(bool)));


Название: Re: Connect не работает
Отправлено: Medved от Август 02, 2022, 12:49
альтернативный метод connect работает, а вот обычный нет. по какой-то причине MOC не может найти сигнал для моего QAction и вылетает с ошибкой

Код:
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,
                                         const QObject *receiver, const char *method,
                                         Qt::ConnectionType type)
{
    ...

    if (method_index_relative < 0) {
        err_method_notfound(receiver, method_arg, "connect");
        err_info_about_objects("connect", sender, receiver);
        return QMetaObject::Connection(nullptr);
    }

    ...
}

Qt 6.3.1, в отладке. QAction pAction = new QAction("text",0);


Название: Re: Connect не работает
Отправлено: kambala от Август 02, 2022, 13:45
всё работает нормально и со старым синтаксисом тоже. может ты забыл добавить параметр bool в свой метод openMyWindow?
Код
C++ (Qt)
void openMyWindow(bool b)


Название: Re: Connect не работает
Отправлено: Medved от Август 02, 2022, 15:34
всё работает нормально и со старым синтаксисом тоже. может ты забыл добавить параметр bool в свой метод openMyWindow?
Код
C++ (Qt)
void openMyWindow(bool b)

нет, не забыл. я же привел пример кода. при чем в других местах программы стандартный connect работает как надо. наверное какая-то проблема либо в самом QAction либо что-то сломалось в мета компиляторе


Название: Re: Connect не работает
Отправлено: kambala от Август 02, 2022, 15:52
я не вижу куска кода, в котором было бы видно объявление этого метода.

попробуй снести папку сборки и построить снова, также посмотри что там MOC генерирует. еще можешь поискать аналогичные багрепорты на https://bugreports.qt.io/

если бы была проблема, она бы наверное проявлялась на всех платформах.


Название: Re: Connect не работает
Отправлено: Medved от Август 03, 2022, 09:51
я не вижу куска кода, в котором было бы видно объявление этого метода.

попробуй снести папку сборки и построить снова, также посмотри что там MOC генерирует. еще можешь поискать аналогичные багрепорты на https://bugreports.qt.io/

если бы была проблема, она бы наверное проявлялась на всех платформах.

уже пробовал. я перепробовал наверное всё, что только возможно прежде чем придти на этот форум.

вот кусок кода

Код:
MainMenu::MainMenu(QWidget* pMainWindow): QMenuBar(pMainWindow)
{
    pAction = new QAction("text");
}

MainWindow::MainWindow(QWidget* pParent) : QMainWindow(pParent)
{

  pMainMenu = new MainMenu()
  setMenuBar(pMainMenu);

  connect(pAction, SIGNAL(triggered(bool)), this, SLOT(openMyWindow(bool)));

}


Название: Re: Connect не работает
Отправлено: kambala от Август 03, 2022, 12:01
ну вот так бы сразу. теперь ошибка очевидна :)

у тебя создан pAction в объекте pMainMenu, а ты пытаешься законнектить pAction из MainWindow, под который не выделена память. правильно будет:
Код
C++ (Qt)
connect(pMainMenu->pAction, SIGNAL(triggered(bool)), this, SLOT(openMyWindow(bool)));


Название: Re: Connect не работает
Отправлено: Medved от Август 03, 2022, 14:41
ну вот так бы сразу. теперь ошибка очевидна :)

у тебя создан pAction в объекте pMainMenu, а ты пытаешься законнектить pAction из MainWindow, под который не выделена память. правильно будет:
Код
C++ (Qt)
connect(pMainMenu->pAction, SIGNAL(triggered(bool)), this, SLOT(openMyWindow(bool)));

ну я так и делаю, см. код в самом начале ветки.
в MainWindow я создаю pMainMenu и получаю pAction из этого pMainMenu


Название: Re: Connect не работает
Отправлено: sergek от Август 03, 2022, 14:54
При использовании старой нотации connect слоты необходимо объявлять явно, например в секции public slots. Думаю, в этом причина.
Для новой, с использованием указателей на функции, этого не требуется.


Название: Re: Connect не работает
Отправлено: sergek от Август 03, 2022, 14:57
Все дело в параметрах.
В сигнале и слоте не совпадают параметры.
В старой нотации в слотах могут не использоваться параметры сигналов.


Название: Re: Connect не работает
Отправлено: Medved от Август 03, 2022, 17:27
При использовании старой нотации connect слоты необходимо объявлять явно, например в секции public slots. Думаю, в этом причина.
Для новой, с использованием указателей на функции, этого не требуется.

тему можно закрыть. в тестовом приложении все работает. в оригинальной программе этот же код не работает. пока что отличий не нашел...


Название: Re: Connect не работает
Отправлено: sergek от Август 03, 2022, 19:11
тему можно закрыть.
Закрывальщики все уехали за бугор ;) Такое ощущение, что человек банально забыл сделать qmake((


Название: Re: Connect не работает
Отправлено: Medved от Август 04, 2022, 09:15
тему можно закрыть.
Закрывальщики все уехали за бугор ;) Такое ощущение, что человек банально забыл сделать qmake((

я не использую qmake. тулчейн QT легко интегрируется в MSVS


Название: Re: Connect не работает
Отправлено: kambala от Август 04, 2022, 10:04
если полная очистка и пересборка проекта не помогает, значит проблема в коде. пока не выложишь минимальный компилируемый пример, в котором воспроизводится ошибка, помочь никто не сможет.