LINUX.ORG.RU

Несрабатывает слот от сигнала.


0

0

Прощу прощения за назойливость но что то у мя совсем не ладиться с этими сигналами. Вообщем надо связать сигнал lastWindowClosed() от app со слотом onExit() из класса kmms. Конеект вроде прошёл но реакции нет. При этом нет никаких сообщений об ошибках.

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

#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();
}
------------------------

kmms.cpp----------------
#include "kmms.h"

kmms::kmms()
{
}

kmms::~kmms()
{
}

void kmms::init()
{
//create object of all need class
mainw = new kmmsMainWindow(MAIN_WINDOW,Qt::WStyle_Customize | Qt::WStyle_NoBorder);
controlw = new kmmsControlWindow(CONTROL_WINDOW,Qt::WStyle_Customize | Qt::WStyle_NoBorder);
playlistw = new kmmsPlaylistWindow(PLAYLIST_WINDOW,Qt::WStyle_Customize | Qt::WStyle_NoBorder);
outw = new kmmsOutWindow(OUT_WINDOW,Qt::WStyle_Customize | Qt::WStyle_NoBorder);

config = new kmmsConfig(); //obj of config class
config->setWindowsProp(mainw,controlw,playlistw,outw); //set all prop of gui

//final stage, show its
mainw->show();
controlw->show();
playlistw->show();
}

QWidget* kmms::getMainWindow()
{
return mainw;
}

void kmms::onExit()
{
QMessageBox::information(
0,
"KMMS",
"You are now exit!!!"
);
// config->writeConfig(mainw, controlw, playlistw, outw);
}
------------------------

kmms.h------------------
#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
{

Q_OBJECT

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 генериться ошибок нет но...
Может кто скажет что не так ???

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

★★★★★

На первый взгляд все ok, попробуй какой-нть clicked() повесить на тот же слот. Возможно, что сигнал просто не emit-ится

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

Добавил в kmms::init() коннект connect(mainw,SIGNAL(closeit()),this,SLOT(onExit())) всё пашет, может и правдо сигнал не эмиитится у app????

void kmms::init()
{
//create object of all need class
mainw = new kmmsMainWindow(MAIN_WINDOW,Qt::WStyle_Customize | Qt::WStyle_NoBorder);
controlw = new kmmsControlWindow(CONTROL_WINDOW,Qt::WStyle_Customize | Qt::WStyle_NoBorder);
playlistw = new kmmsPlaylistWindow(PLAYLIST_WINDOW,Qt::WStyle_Customize | Qt::WStyle_NoBorder);
outw = new kmmsOutWindow(OUT_WINDOW,Qt::WStyle_Customize | Qt::WStyle_NoBorder);

config = new kmmsConfig(); //obj of config class
config->setWindowsProp(mainw,controlw,playlistw,outw); //set all prop of gui

//final stage, show its
mainw->show();
controlw->show();
playlistw->show();

connect(mainw,SIGNAL(closeit()),this,SLOT(onExit()));
}


Но почему он не эммитится ????????

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

Хммм, стоило отрубить

app.setMainWidget(player->getMainWindow()); //set main widget

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

Надо что бы по закрытию главного виджета остальные тоже гасли. И вторая это то что слот onExit в котором висит показ мессадж бокса почему то зацикливается :(( и нажав на окей я снова вижу этот мессадж бокс :((

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

у тебя 2-3 окна, типа как в винампе, так ? Отлавливай closeEvent внутри каждого и не парь мозги с сигналами, это удобнее и проще ;)

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

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

Вообщем проблемму решил, правдо не знаю до куда это решение дотянет и не станет тупиком но всё же.. вообщем ща всё вроде закрывается и выполняется ;)

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

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

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

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

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

void QWidget::closeEvent ( QCloseEvent * e ) [virtual protected]
This event handler, for event e, can be reimplemented in a subclass to receive widget close events.
The default implementation calls e->accept(), which hides this widget. See the QCloseEvent documentation for more details.

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

Сенкс за инфу, на будущее пригодится.

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