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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Сигналы и слоты: подскажите как подвязать функцию к кнопке..?  (Прочитано 9207 раз)
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();

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Апрель 03, 2010, 15:48 »

>>но нормального примера по тому как такое простейшее и базовое действие сделать в QT - я не нашёл.
Не искал!
>>&app, SLOT( myClass->MyFunc() )
Ересь.
Читай учебное пособие
Записан

Юра.
CProger
Гость
« Ответ #2 : Апрель 03, 2010, 15:53 »

lit-uriy
а где там привязывание к функциям? Там либо на базе собственного компонента, что мне не нужно, либо вообще никак нету)
У меня ведь сделано уже то, что вы привели по ссылке. Я читал уже это. Или там и пример с привязыванием где-то приводится?

>> Ересь.
Может быть вы бы подсказали как написать неересь, а то тоже самое, что и вы - мне компилятор уже сказал. О чём я и написал в первом посте.
« Последнее редактирование: Апрель 03, 2010, 16:05 от CProger » Записан
CProger
Гость
« Ответ #3 : Апрель 03, 2010, 16:25 »

Попробовал подправить на:
Код:
QObject::connect( button2, SIGNAL( clicked() ), &myClass, SLOT( MyFunc() ) );
тоже не срабатывает. К чему ж такие сложности, когда нужно всего лишь по клику кнопки вызвать функцию?
Записан
ieroglif
Гость
« Ответ #4 : Апрель 03, 2010, 16:56 »

при проектировании формы (в дизайнере) кликни правой мышкой по "кнопке" (или тому элементу чей слот тебя интересует) и выбери "Перейти к слоту", там выбери интересующий тебя (например "clicked()") и у тебя автоматом всё создастся и привяжется.
Записан
SABROG
Гость
« Ответ #5 : Апрель 03, 2010, 17:00 »

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

Тут у тебя уже проблемы со знанием C++. myClass - указатель, а ты берешь адрес указателя &myCLass, вместо того, чтобы передать адрес объекта на который он указывает.
Записан
CProger
Гость
« Ответ #6 : Апрель 03, 2010, 17:01 »

при проектировании формы (в дизайнере) кликни правой мышкой по "кнопке" (или тому элементу чей слот тебя интересует) и выбери "Перейти к слоту", там выбери интересующий тебя (например "clicked()") и у тебя автоматом всё создастся и привяжется.
аа.. вон почему таких вопросов не возникает у народа.. Улыбающийся А я это всё вручную верстаю. Сейчас скачаю, поставлю QT Designer, попробую..
Записан
CProger
Гость
« Ответ #7 : Апрель 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.. Улыбающийся

А вручную тут много надо править, чтобы оно подвязалось?
« Последнее редактирование: Апрель 03, 2010, 17:05 от CProger » Записан
SABROG
Гость
« Ответ #8 : Апрель 03, 2010, 17:08 »

Вставь в конец исходника:

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

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

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

Записан
CProger
Гость
« Ответ #9 : Апрель 03, 2010, 17:17 »

обалдеть.. заработало.. А почему?? Веселый Удалил ещё раз все файлы, снова скомпилил. Опять скомпилилось успешно.. анбеливебал Веселый
Спасибо!!
Записан
SABROG
Гость
« Ответ #10 : Апрель 03, 2010, 17:36 »

А почему?? Веселый

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

P.S.: "пардонси за сиськи" © Декстер, #include "main.moc" это старый способ, который не рекомендуют использовать, лучше #include "moc_main.cpp"
« Последнее редактирование: Апрель 03, 2010, 19:39 от SABROG » Записан
CProger
Гость
« Ответ #11 : Апрель 04, 2010, 00:08 »

А почему?? Веселый

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

P.S.: "пардонси за сиськи" © Декстер, #include "main.moc" это старый способ, который не рекомендуют использовать, лучше #include "moc_main.cpp"
аа.. понятно. Спасибо большое!
Записан
CProger
Гость
« Ответ #12 : Апрель 04, 2010, 00:10 »

Но тут проблемка возникает Улыбающийся
main.cpp:179:25: error: moc_main.cpp: Нет такого файла или каталога

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

добавлено
ага, разобрался! данная проблема решается дописыванием: HEADERS += main.cpp в .pro файл и перегенерированием (qmake). Корявое решение конечно.. лучше выносить в .h файл. Ну это далее Улыбающийся спасибо за помощь!
« Последнее редактирование: Апрель 04, 2010, 00:25 от CProger » Записан
SABROG
Гость
« Ответ #13 : Апрель 04, 2010, 00:44 »

Хмм, может быть тогда с HEADERS вообще include в main.cpp не нужен?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #14 : Апрель 04, 2010, 09:05 »

ieroglif, а причём здесь дизайнер, ты вообще на сообщение смотрел, читал?

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

Юра.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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