2013-02-23 36 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; 
} 
相关问题