首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用QApplication的quit()方法

调用QApplication的quit()方法
EN

Stack Overflow用户
提问于 2013-02-23 21:21:41
回答 3查看 19K关注 0票数 6

如果我尝试直接使用quit()方法,它可以很好地编译,但是在运行时会出现一个错误:"Object::connect: No slot myClass::quit()“。那么,为了避免这种情况,有没有办法呢?通过使用方法quitPicture()(定义为插槽),应用程序可以很好地工作。这是唯一的解决方案吗?

代码语言:javascript
复制
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();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-23 21:32:26

按钮的clicked信号可以直接连接到应用程序的quit插槽:

代码语言:javascript
复制
QObject::connect(quitButton, SIGNAL(clicked()),
                 QApplication::instance(), SLOT(quit()));
票数 13
EN

Stack Overflow用户

发布于 2016-05-12 08:51:21

这个答案涵盖了Qt中新的信号/槽语法,另外还涵盖了在使用使用重载的信号时如何处理它。

对于没有过载的信号,使用QObject作为示例对象:

代码语言:javascript
复制
QObject obj(nullptr); 

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

对于使用QProcess作为示例对象的重载信号:

代码语言:javascript
复制
QProcess * process = new QProcess(QCoreApplication::instance());

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

这个看起来很疯狂的语法基本上是这样的,就像占位符语法:

代码语言:javascript
复制
static_cast< _signalReturnType_( _ObjectName::*_ )( _overloadType1_, _overloadType2_, \
…etc )>( _&ObjectName::signalName_ )

如果你想了解更多关于原因的细节,你可以查看this link

由于QProcess有两个重载,这是它的另一个重载:

代码语言:javascript
复制
QProcess * process = new QProcess(QCoreApplication::instance());

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

如果这些看起来很疯狂的东西让你头晕目眩,别担心。你可以在这里评论问题,因为我通常每天都会检查,至少现在是这样。

票数 0
EN

Stack Overflow用户

发布于 2017-04-01 02:08:15

代码语言:javascript
复制
void my_exit_func()
{
    // in mainwindow.cpp
    delete MainWindow;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15040988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档