6

如果我尝试直接使用 quit() 方法,它会完美编译,但是在运行时会出现错误消息“Object::connect: No such slot myClass::quit()”。所以要避免这种情况,有什么办法吗?通过使用方法 quitPicture()(defined as 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();
}
4

3 回答 3

13

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

QObject::connect(quitButton, SIGNAL(clicked()),
                 QApplication::instance(), SLOT(quit()));
于 2013-02-23T13:32:26.327 回答
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_ )

如果您想了解原因的详细信息,可以查看此链接。

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

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

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

如果这个看起来很疯狂的东西让你头晕目眩,不要出汗。你可以在这里评论问题,因为我通常每天都会检查 SO,或者至少现在是这样。

于 2016-05-12T00:51:21.413 回答
0
void my_exit_func()
{
    // in mainwindow.cpp
    delete MainWindow;
}
于 2017-03-31T18:08:15.317 回答