2013-02-23 38 views
5

如果我嘗試直接使用quit()方法,它編譯得很完美, 但是在運行時出現錯誤,說「Object :: connect:No such slot myClass :: quit() 「。 所以爲了避免這種情況,有什麼辦法嗎? 通過使用方法quitPicture()(定義爲插槽)應用程序工作正常。 這是唯一的解決方案嗎?調用QApplication的quit()方法

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

回答

11

按鈕的clicked信號可以直接連接到應用程序的quit槽:

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

非常感謝。有用 :) – suma 2013-02-24 03:40:54

0

此答案覆蓋Qt中新的信號/槽的語法,並且還附加地包括如何使用的信號時,處理它使用重載。

有關使用的QObject作爲示例對象沒有過載的信號:

QObject obj(nullptr); 

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

對於信號用QProcess中作爲一個例子對象重載:

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

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

那個瘋狂的前瞻性語法基本上是這樣,作爲佔位符語法:

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

您可以檢出this link如果你想知道爲什麼細節。

由於QProcess中有兩個重載,這是其他重載它:

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

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

如果這個怪模怪樣的東西是旋轉你的頭,不出汗。你可以在這裏評論問題,因爲我通常每天都會檢查SO,或者至少現在。

0
void my_exit_func() 
{ 
    // in mainwindow.cpp 
    delete MainWindow; 
} 
相關問題