LINUX.ORG.RU

Опять связать сигнал со слотом :(


0

0

Вообщем потребовалось связать сигнал и слот, сигнал от QApplication обьекта app и обьекта класса kmms - player. Но проблемма в том что kmms это чистый класс не производный от чего либо в том числе и QObject, а проблемма в том что функция connect понимает только обьекты QObject, ну не долго думая я взял и сделал kmms : public QObject. Но только это не помогло так как надо, т.е. connect теперь вроде бы связывает app и player, но это только кажется, когда запускаешь прогу оно говорит

$ ./kmms
QObject::connect: No such slot QObject::onExit()
QObject::connect: (sender name: 'lt-kmms')
QObject::connect: (receiver name: 'unnamed')

(it-kmms это название проги, хотя прога и называется kmms только libtools почему то переименовывает её при запуске в it-kmms, но если её собрать и поставить make install то она запускается как надо)

тут видно что не виден обьект player и его слот.

А вот и код:

main.cpp---------------------

#include "kmms.h"

int main(int argc, char **argv)
{
QApplication app ( argc, argv );
kmms *player = new kmms;
player->init();
app.setMainWidget(player->getMainWindow());
app.connect(&app,SIGNAL(lastWindowClosed()),player,SLOT(onExit()));

return app.exec();
}
--------------------------------

kmms.cpp------------------------
#include "front/kmmsmainwindow.h"
#include "front/kmmscontrolwindow.h"
#include "front/kmmsplaylistwindow.h"
#include "front/kmmsoutwindow.h"
#include "front/kmmsscin.h"
#include "kmmsconfig.h"

//main class
class kmms : public QObject
{

public:
kmms(); //constructor
virtual ~kmms(); //deconstructor

void init(); //init function
QWidget* getMainWindow(); //get descriptor of main window, it need for set main widget

kmmsScin *scin; //scin
kmmsConfig *config; //config

kmmsMainWindow *mainw; //main window
kmmsControlWindow *controlw; //control window
kmmsPlaylistWindow *playlistw; //playlist window
kmmsOutWindow *outw; //out put window

public slots:
void onExit(); //on exit

};
--------------------------------

видно что слот на месте.

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

Заранее спасибо!!!

★★★★★

имхо, нужно через moc пропустить, что бы сигналы и слоты были видны в kmms

anonymous
()

class kmms : public QObject
{
Q_OBJECT

Попробуй.

olegk ★★
()
Ответ на: комментарий от anonymous

Не помогает, moc точно создаётся, лежит в debug/src там где и собирается прога, вот только его размер 0кб !

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

>Не помогает, moc точно создаётся, лежит в debug/src там где и собирается прога, вот только его размер 0кб !

ТАК ДОБАВЬ Q_OBJECT!!!! Тогда станет больше чем 0кб:)

olegk ★★
()
Ответ на: комментарий от cyclon

а с Q_OBJECT не собирается.

/bin/sh ../libtool --silent --mode=link --tag=CXX g++ -Wnon-virtual-dtor -Wno-long-long -Wundef -Wall -W -Wpointer-arith -Wwrite-strings -ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion -Wchar-subscripts -g3 -fno-inline -O0 -g3 -Wformat-security -Wmissing-format-attribute -fno-exceptions -fno-check-new -fno-common -o kmms -R /usr/kde/3.3/lib -R /usr/qt/3/lib -R /usr/lib -L/usr/lib -L/usr/qt/3/lib -L/usr/kde/3.3/lib main.o kmmsconfig.o kmms.o ../src/front/libgui.la -lkdeui
kmms.o(.text+0x126): In function `kmms::kmms()':
/home/alexandr/Documents/Coding/C++/MyProjects/kmms/src/kmms.cpp:25: undefined reference to `vtable for kmms'
kmms.o(.text+0x152): In function `kmms::kmms()':
/home/alexandr/Documents/Coding/C++/MyProjects/kmms/src/kmms.cpp:25: undefined reference to `vtable for kmms'
kmms.o(.text+0x163): In function `kmms::~kmms()':
/home/alexandr/Documents/Coding/C++/MyProjects/kmms/src/kmms.cpp:29: undefined reference to `vtable for kmms'
kmms.o(.text+0x197): In function `kmms::~kmms()':
/home/alexandr/Documents/Coding/C++/MyProjects/kmms/src/kmms.cpp:29: undefined reference to `vtable for kmms'
kmms.o(.text+0x1cb): In function `kmms::~kmms()':
/home/alexandr/Documents/Coding/C++/MyProjects/kmms/src/kmms.cpp:29: undefined reference to `vtable for kmms'
collect2: ld returned 1 exit status
gmake[3]: *** [kmms] Ошибка 1
gmake[3]: Цель `all-am' не была пересобрана из-за ошибок.
gmake[2]: *** [all-recursive] Ошибка 1
<br />
gmake[2]: Цель `all' не была пересобрана из-за ошибок.
gmake[1]: *** [all-recursive] Ошибка 1
gmake: *** [all] Ошибка 2
*** Завершено с кодом: 2 ***

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Бред какой то не хочет автоматом moc создаваться, но нужно что бы было именно так иначе он собираться не будет потом, а после ручной сборки kmms.moc всё запахало.

Есть ещё класс который тоже юзает moc, так вот, там moc собрался для него нормально.

Вот только почему kmms.moc не собрался автоматом???

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Покажи, что выдает теперь с Q_OBJECT и #include "kmms.moc"

А также ls -l

olegk ★★
()
Ответ на: комментарий от olegk

Короче сохранил текущий проект в другой папке и создал его заново, записал в мэйки всё заново и переписал полученные автогеном скелеты старым проектом который как я уже сказал сохранил, теперь вроде всё собралось, но если такие глюки будут повторяться я повешусь :(

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

мддааа, а вот сигнал не обрабатывается :(

#include "kmms.h"

int main(int argc, char **argv)
{
QApplication app ( argc, argv );
kmms *player = new kmms; //create kmms :))
player->init(); //init
app.setMainWidget(player->getMainWindow()); //set main widget
app.connect(&app,SIGNAL(lastWindowClosed()),player,SLOT(onExit()));

return app.exec();
}

вот тут видно соединение, а вот толку нет. В качестве проверки в onExit() стоит вывод мессаджбокса, но он не выводиться :((

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

У меня собсно kmms как видно не является окном, окнами проги являются виджеты создаваемые внутри kmms класса kmmsWindow, ну не совсем его а производные, но тем не менее... вообщем я пробовал обработать закрытие такого окна так

void kmmsWindow::closeEvent( QCloseEvent * e )
{
closeit(); // это сигнал о закрытие для kmms
}

т.е. поставил обработку события закрытия, но в итоге получил ещё более не понятный результат, окна вообще перестало быть возможно закрыть, т.е. в таскбаре щёлкаю закрыть всё а он не закрывается, единственный способ закрыть прогу это убить его. Пробовал в kmmsWindow::closeEvent() добавить close() но не помогло.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

если Q_OBJECT не было изначально, и проект компилировался, а потом ты добавил Q_OBJECT, то нужно сделать distclean/rebuild all, или как там в kdevelop3.

#include "kmms.moc" не поможет, т.к. этот .moc нужно откомпилить и засунуть в бинарник - g++ -o kmms ... kmms.o kmms.moc.o ..., чего у тебя не происходит, оттого и linker error'ы :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.