2015-07-05 3 views
-2

У меня есть проблема в отношении connect() метод, ОТСУТСТВИЯ из них ниже вызовов работы:Qt надлежащего подключения() вызова

connect(tutorial->back, SIGNAL(clicked()), this, SLOT(exit_button_clicked())); 
connect(tutorial->back, &QPushButton::clicked(), this, &MyMainWindow::exit_button_clicked()); 

Первый не вызывает exit_button_clicked() и второй один говорит мне, что clicked() должен быть статическим (в Clion) и не компилируется. back является QPushButton и tutorial является обычным классом QWidget. Важно реализовать этот метод, вызывая пользовательскую функцию (для дальнейшего использования). Может ли кто-нибудь показать мне правильный способ реализовать это?

UPDATE:

проблема была с моей CMakeLists.txt, я добавил set(CMAKE_AUTOMOC ON) и Q_Object макросов в моих классах, и теперь он работает отлично.

+0

Является ли ваш 'exit_button_clicked()' объявленным слотом в вашем файле заголовка? – kefir500

+0

«Может ли кто-нибудь показать мне правильный способ реализовать это?» Документация Qt имеет около траллиона. – Slyps

+0

@ Slyps да, я знаю, что (я прочитал его сто раз), но первый подход должен генерировать правильный ответ, с ним нет ничего плохого, на мой взгляд. Я просто не могу понять, почему это не работает – kahrabian

ответ

0

Предполагаю, что ваш exit_button_clicked() объявлен как частная или общественная функция (а не как слот). Пользовательские сигналы и слоты Qt должны быть объявлены надлежащим образом. Например, у вас есть класс Учебник:

class Tutorial : QWidget { 
    Q_OBJECT 
    // Your class members go here. 
    // Add this slot declaration: 
    private slots: 
     void exit_button_clicked(); 
} 

(Учитывайте slots ключевое слово рядом с private).

Игровые автоматы могут быть общественными или защищенными, как вы пожелаете.

+0

это моя реализация: [link] (http : //paste.ubuntu.com/11825142/) – kahrabian

+0

В вашем классе отсутствует макрос 'Q_OBJECT' – kefir500

+0

да, я удалил его, потому что он дает мне ошибку компиляции:' undefined reference to 'vtable for MyMenu'' – kahrabian

2

В первом случае должно быть что-то не так с вашим слотом exit_button_clicked(). Он должен быть простой функцией-членом с спецификатором slots, принимающим void и возвращающим void в классе с макросом Q_OBJECT. Если соединение выходит из строя, он записывает ошибку во время выполнения на консоль (возможно, через qDebug()).

Во втором случае ясно, что после имен функций у вас есть дополнительные (). Принимая адреса функций выглядит следующим образом:

connect(tutorial->back, &QPushButton::clicked, this, &MyMainWindow::exit_button_clicked); 

&QPushButton::clicked() пытается вызвать функцию и принять адрес возвращаемого значения, который, конечно, терпит неудачу во время компиляции, потому что QPushButton::clicked не static.

Надеюсь, это прояснит это. Взгляд в документацию не принесет вреда.

+0

благодарю вас за ответ, но он по-прежнему не работает (второй метод), это дает мне компиляцию ошибок, которые я не понимаю: [link] (http://paste.ubuntu.com/11825150/) и о первом - это то, как я его реализую: [link] (http: // paste.ubuntu.com/11825153/) – kahrabian

+0

my 'CMakeLists.txt' был проблемой, я добавил 'set (CMAKE_AUTOMOC ON)', и теперь он отлично работает (оба метода), спасибо за ваш ответ :-) – kahrabian

Смежные вопросы