2013-02-23 10 views
5

jeśli spróbuję użyć metody quit() bezpośrednio, to kompiluje się idealnie, , jednak w czasie działania pojawia się komunikat "Object :: connect: No takie miejsce myClass :: quit() . " , aby tego uniknąć, czy istnieje jakiś sposób? za pomocą metody quitPicture() (zdefiniowanej jako slot) aplikacja działa poprawnie. jest to jedyne rozwiązanie?wywoływanie metody quit() z QApplication

myClass::myClass(QWidget *parent) 
    : QWidget(parent) 
{ 
    QWidget *window = new QWidget; 
    window->setWindowTitle(QObject::tr("Class")); 

    QPushButton *quitButton = new QPushButton("&Quit"); 
// QObject::connect(quitButton, SIGNAL(clicked()), this, SLOT(quit()));  //showing run time error 
    QObject::connect(quitButton, SIGNAL(clicked()), this, SLOT(quitPicture())); //working perfectly 

    QHBoxLayout *layout = new QHBoxLayout; 
    layout->addWidget(this); 
    layout->addWidget(quitButton); 
    window->setLayout(layout); 
    window->show(); 
} 

void myClass::quitPicture() 
{ 
    std::cout << "calling quitPicture" << std::endl; 
    QApplication::quit(); 
} 

Odpowiedz

11

clicked sygnał przycisk może być podłączony bezpośrednio do aplikacji quit gniazda:

QObject::connect(quitButton, SIGNAL(clicked()), 
       QApplication::instance(), SLOT(quit())); 
+1

Dziękuję bardzo. to działa :) – suma

0

Odpowiedź ta obejmuje nowy sygnał/gniazda składni w Qt, a także dodatkowo obejmuje, jak obsługiwać go przy użyciu sygnału który wykorzystuje przeciążenia.

Dla sygnałów bez żadnych przeciążeń korzystających QObject jako przykład obiektu:

QObject obj(nullptr); 

QObject::connect(&obj, &QObject::destroyed, QCoreApplication::instance(), \ 
&QCoreApplication::quit); 

Dla sygnałów z przeciążeniami korzystających QProcess jako przykład obiektu:

QProcess * process = new QProcess(QCoreApplication::instance()); 

QObject::connect(process, static_cast<void (QProcess::*)(int)>(&QProcess::finished), \ 
        QCoreApplication::instance(), &QCoreApplication::quit); 

To składnia crazy-patrząc jest w zasadzie to, jako składnia zastępcza:

static_cast< _signalReturnType_(_ObjectName::*_)(_overloadType1_, _overloadType2_, \ 
…etc)>(_&ObjectName::signalName_) 

Możesz sprawdzić this link, jeśli chcesz poznać szczegóły.

Od QProcess ma dwa przeciążeń, jest to dla niego drugi przeciążenie:

QProcess * process = new QProcess(QCoreApplication::instance()); 

QObject::connect(process, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(\ 
&QProcess::finished), QCoreApplication::instance(), &QCoreApplication::quit); 

Jeśli ten szalony wyglądające rzeczy kręci głową, nie przejmuj się. Możesz tutaj komentować pytania, ponieważ zazwyczaj sprawdzam SO codziennie lub przynajmniej w dzisiejszych czasach.

0
void my_exit_func() 
{ 
    // in mainwindow.cpp 
    delete MainWindow; 
} 
Powiązane problemy