Russian Qt Forum

Qt => Общие вопросы => Тема начата: CProger от Апрель 03, 2010, 15:45



Название: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: CProger от Апрель 03, 2010, 15:45
Извиняюсь за очень чайниковский вопрос, но нормального примера по тому как такое простейшее и базовое действие сделать в QT - я не нашёл. Ни в гугле, ни на официальном сайте. Хотя делал по аналогии с офисайтом.
Я хотел вызвать собственную функцию по клику на button2. Почему у меня не работает этот пример?
Ошибка такая:
Цитировать
main.o: In function `MyClass::MyClass()':
main.cpp:(.text+0x1e): undefined reference to `vtable for MyClass'
main.o: In function `MyClass::MyClass()':
main.cpp:(.text+0x3e): undefined reference to `vtable for MyClass'

полный код:
Код:
#include <QApplication>
#include <QPushButton>
#include <QWidget>
#include <QGridLayout>

class MyClass : public QObject {

Q_OBJECT
 
public:
MyClass();
 
public slots:
void MyFunc();

};

MyClass::MyClass() {
}

void MyClass::MyFunc() {

printf ( "asdffffffffdasf\n" );

}

int main( int argc, char *argv[] ) {

QApplication app( argc, argv );
QWidget *window = new QWidget;
window->resize( 500, 500 );

QPushButton *button1 = new QPushButton( "One" );
QObject::connect( button1, SIGNAL( clicked() ), &app, SLOT( quit() ) );

MyClass *myClass = new MyClass();

QPushButton *button2 = new QPushButton( "Two" );
QObject::connect( button2, SIGNAL( clicked() ), &app, SLOT( myClass->MyFunc() ) ); /* вот тут проблема */

QGridLayout *layout = new QGridLayout;
layout->addWidget( button1, 0, 0 );
layout->addWidget( button2, 0, 1 );

window->setLayout( layout );
window->show();

return app.exec();

}


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: lit-uriy от Апрель 03, 2010, 15:48
>>но нормального примера по тому как такое простейшее и базовое действие сделать в QT - я не нашёл.
Не искал!
>>&app, SLOT( myClass->MyFunc() )
Ересь.
Читай учебное пособие (http://doc.crossplatform.ru/qt/4.5.0/widgets-tutorial.html)


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: CProger от Апрель 03, 2010, 15:53
lit-uriy
а где там привязывание к функциям? Там либо на базе собственного компонента, что мне не нужно, либо вообще никак нету)
У меня ведь сделано уже то, что вы привели по ссылке. Я читал уже это. Или там и пример с привязыванием где-то приводится?

>> Ересь.
Может быть вы бы подсказали как написать неересь, а то тоже самое, что и вы - мне компилятор уже сказал. О чём я и написал в первом посте.


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: CProger от Апрель 03, 2010, 16:25
Попробовал подправить на:
Код:
QObject::connect( button2, SIGNAL( clicked() ), &myClass, SLOT( MyFunc() ) );
тоже не срабатывает. К чему ж такие сложности, когда нужно всего лишь по клику кнопки вызвать функцию?


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: ieroglif от Апрель 03, 2010, 16:56
при проектировании формы (в дизайнере) кликни правой мышкой по "кнопке" (или тому элементу чей слот тебя интересует) и выбери "Перейти к слоту", там выбери интересующий тебя (например "clicked()") и у тебя автоматом всё создастся и привяжется.


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: SABROG от Апрель 03, 2010, 17:00
Попробовал подправить на:
Код:
QObject::connect( button2, SIGNAL( clicked() ), &myClass, SLOT( MyFunc() ) );
тоже не срабатывает. К чему ж такие сложности, когда нужно всего лишь по клику кнопки вызвать функцию?

Тут у тебя уже проблемы со знанием C++. myClass - указатель, а ты берешь адрес указателя &myCLass, вместо того, чтобы передать адрес объекта на который он указывает.


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: CProger от Апрель 03, 2010, 17:01
при проектировании формы (в дизайнере) кликни правой мышкой по "кнопке" (или тому элементу чей слот тебя интересует) и выбери "Перейти к слоту", там выбери интересующий тебя (например "clicked()") и у тебя автоматом всё создастся и привяжется.
аа.. вон почему таких вопросов не возникает у народа.. :) А я это всё вручную верстаю. Сейчас скачаю, поставлю QT Designer, попробую..


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: CProger от Апрель 03, 2010, 17:03
Попробовал подправить на:
Код:
QObject::connect( button2, SIGNAL( clicked() ), &myClass, SLOT( MyFunc() ) );
тоже не срабатывает. К чему ж такие сложности, когда нужно всего лишь по клику кнопки вызвать функцию?

Тут у тебя уже проблемы со знанием C++. myClass - указатель, а ты берешь адрес указателя &myCLass, вместо того, чтобы передать адрес объекта на который он указывает.
я и амперсанд пробовал убрать, оно мне всё про:
main.o: In function `MyClass::MyClass()':
main.cpp:(.text+0x1e): undefined reference to `vtable for MyClass'

а я и не понимаю о чём это он :) какая-то vtable.. :)

А вручную тут много надо править, чтобы оно подвязалось?


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: SABROG от Апрель 03, 2010, 17:08
Вставь в конец исходника:

Код
C++ (Qt)
#include "main.moc"
 

Затем сделай:

Код
C++ (Qt)
make distclean && qmake && make
 



Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: CProger от Апрель 03, 2010, 17:17
обалдеть.. заработало.. А почему?? :D Удалил ещё раз все файлы, снова скомпилил. Опять скомпилилось успешно.. анбеливебал :D
Спасибо!!


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: SABROG от Апрель 03, 2010, 17:36
А почему?? :D

Мета-объектный компилятор по умолчанию обрабатывает только файлы заголовков. У тебя класс объявлен в .cpp файле, нужно было сказать moc компилятору, чтобы он его обработал и сгенерил статические данные для того, чтобы работала система сигналов и слотов. Читай документацию.

P.S.: "пардонси за сиськи" © Декстер, #include "main.moc" это старый способ, который не рекомендуют использовать, лучше #include "moc_main.cpp"


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: CProger от Апрель 04, 2010, 00:08
А почему?? :D

Мета-объектный компилятор по умолчанию обрабатывает только файлы заголовков. У тебя класс объявлен в .cpp файле, нужно было сказать moc компилятору, чтобы он его обработал и сгенерил статические данные для того, чтобы работала система сигналов и слотов. Читай документацию.

P.S.: "пардонси за сиськи" © Декстер, #include "main.moc" это старый способ, который не рекомендуют использовать, лучше #include "moc_main.cpp"
аа.. понятно. Спасибо большое!


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: CProger от Апрель 04, 2010, 00:10
Но тут проблемка возникает :)
main.cpp:179:25: error: moc_main.cpp: Нет такого файла или каталога

QT у меня линуксовый, самой новой версии.

добавлено
ага, разобрался! данная проблема решается дописыванием: HEADERS += main.cpp в .pro файл и перегенерированием (qmake). Корявое решение конечно.. лучше выносить в .h файл. Ну это далее :) спасибо за помощь!


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: SABROG от Апрель 04, 2010, 00:44
Хмм, может быть тогда с HEADERS вообще include в main.cpp не нужен?


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: lit-uriy от Апрель 04, 2010, 09:05
ieroglif, а причём здесь дизайнер, ты вообще на сообщение смотрел, читал?

>>аа.. вон почему таких вопросов не возникает у народа
Ещё одна ересь, вопросов не возникает из-за знания С++.
ieroglif'а, не слушай учись руками в коде делать, иначе не поймёшь, что и как.


Название: Re: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?
Отправлено: CProger от Апрель 04, 2010, 12:41
HEADERS += main.cpp
мне этот костыль не помог.
а вы всё кроме исходника и .про файла удаляли? Инклюдить в конце надо: #include <moc_main.cpp> И после этого qmake && make.

SABROG
не, без инклюда не срабатывает.