Russian Qt Forum
Апрель 18, 2024, 18:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Connect не работает  (Прочитано 3731 раз)
Medved
Новичок

Offline Offline

Сообщений: 15


Просмотр профиля
« : Август 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 не может найти сигнал во втором случае.
Записан
vbv
Чайник
*
Offline Offline

Сообщений: 59


Просмотр профиля
« Ответ #1 : Август 01, 2022, 17:13 »

Все дело в параметрах.
В сигнале и слоте не совпадают параметры.
Записан
Medved
Новичок

Offline Offline

Сообщений: 15


Просмотр профиля
« Ответ #2 : Август 01, 2022, 18:26 »

Все дело в параметрах.
В сигнале и слоте не совпадают параметры.

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

также не работает... не может найти сигнал triggered по какой-то причине.
« Последнее редактирование: Август 01, 2022, 18:29 от Medved » Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #3 : Август 01, 2022, 18:30 »


Код:
connect(pAction, SIGNAL(triggered(bool)), this, SLOT(openMyWindow()));
Записан
vbv
Чайник
*
Offline Offline

Сообщений: 59


Просмотр профиля
« Ответ #4 : Август 01, 2022, 20:11 »


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


Точно, не досмотрел.
Записан
Medved
Новичок

Offline Offline

Сообщений: 15


Просмотр профиля
« Ответ #5 : Август 02, 2022, 12:20 »


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


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

Код:
connect(pAction, SIGNAL(triggered(bool)), this, SLOT(openMyWindow(bool)));
Записан
Medved
Новичок

Offline Offline

Сообщений: 15


Просмотр профиля
« Ответ #6 : Август 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);
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #7 : Август 02, 2022, 13:45 »

всё работает нормально и со старым синтаксисом тоже. может ты забыл добавить параметр bool в свой метод openMyWindow?
Код
C++ (Qt)
void openMyWindow(bool b)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Medved
Новичок

Offline Offline

Сообщений: 15


Просмотр профиля
« Ответ #8 : Август 02, 2022, 15:34 »

всё работает нормально и со старым синтаксисом тоже. может ты забыл добавить параметр bool в свой метод openMyWindow?
Код
C++ (Qt)
void openMyWindow(bool b)

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

Сообщений: 4727



Просмотр профиля WWW
« Ответ #9 : Август 02, 2022, 15:52 »

я не вижу куска кода, в котором было бы видно объявление этого метода.

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

если бы была проблема, она бы наверное проявлялась на всех платформах.
« Последнее редактирование: Август 02, 2022, 15:53 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Medved
Новичок

Offline Offline

Сообщений: 15


Просмотр профиля
« Ответ #10 : Август 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)));

}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #11 : Август 03, 2022, 12:01 »

ну вот так бы сразу. теперь ошибка очевидна Улыбающийся

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Medved
Новичок

Offline Offline

Сообщений: 15


Просмотр профиля
« Ответ #12 : Август 03, 2022, 14:41 »

ну вот так бы сразу. теперь ошибка очевидна Улыбающийся

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

ну я так и делаю, см. код в самом начале ветки.
в MainWindow я создаю pMainMenu и получаю pAction из этого pMainMenu
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #13 : Август 03, 2022, 14:54 »

При использовании старой нотации connect слоты необходимо объявлять явно, например в секции public slots. Думаю, в этом причина.
Для новой, с использованием указателей на функции, этого не требуется.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #14 : Август 03, 2022, 14:57 »

Все дело в параметрах.
В сигнале и слоте не совпадают параметры.
В старой нотации в слотах могут не использоваться параметры сигналов.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 23.