Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 调用QApplication的quit()方法_Qt - Fatal编程技术网

Qt 调用QApplication的quit()方法

Qt 调用QApplication的quit()方法,qt,Qt,如果我尝试直接使用quit()方法,它可以完美地编译, 但是在运行时会出现一个错误:“Object::connect:没有这样的插槽myClass::quit() 那么为了避免这种情况,有什么办法吗? 通过使用quitPicture()方法(定义为slot),应用程序工作正常。 这是唯一的解决办法吗 myClass::myClass(QWidget *parent) : QWidget(parent) { QWidget *window = new QWidget; wi

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

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();
}
myClass::myClass(QWidget*parent)
:QWidget(父项)
{
QWidget*窗口=新的QWidget;
窗口->设置窗口标题(QObject::tr(“类”);
QPushButton*quitButton=新建QPushButton(“&Quit”);
//QObject::connect(退出按钮,信号(单击()),this,SLOT(退出());//显示运行时错误
QObject::connect(退出按钮、信号(单击())、此、插槽(退出图片());//工作正常
QHBoxLayout*布局=新的QHBoxLayout;
布局->添加小部件(此);
布局->添加小部件(退出按钮);
窗口->设置布局(布局);
窗口->显示();
}
void myClass::quitPicture()
{

std::cout按钮的
点击信号可以直接连接到应用程序的
退出
插槽:

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

这个答案涵盖了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); 
QProcess*process=新的QProcess(QCoreApplication::instance());
QObject::connect(进程、静态转换(&QProcess::finished)\
QCoreApplication::instance(),&QCoreApplication::quit);
这种看似疯狂的语法基本上是这样的,作为占位符语法:

static_cast< _signalReturnType_( _ObjectName::*_ )( _overloadType1_, _overloadType2_, \
…etc )>( _&ObjectName::signalName_ )
static\u cast<\u signalReturnType\u(\u ObjectName::*\u)(\u重载类型1\u,\u重载类型2\u\
…etc)>(\u对象名称::信号名称(&O)
如果您想了解原因的详细信息,可以查看

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

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

QObject::connect(process, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>( \
 &QProcess::finished ), QCoreApplication::instance(), &QCoreApplication::quit);
QProcess*process=新的QProcess(QCoreApplication::instance());
QObject::connect(进程、静态转换(\
&QProcess::finished),QCoreApplication::instance(),&QCoreApplication::quit);
如果这个看起来很疯狂的东西让你头晕目眩,别担心。你可以在这里评论问题,就像我通常每天检查的那样,至少现在是这样

void my_exit_func()
{
    // in mainwindow.cpp
    delete MainWindow;
}