如果我尝试直接使用quit()方法,它编译完美, 但是在运行时出现错误,说“对象::连接:没有这样的插槽myClass :: quit()。” 所以要避免这种情况,有什么办法吗? 通过使用方法quitPicture()(定义为槽),应用程序正常工作。 这是唯一的解决方案吗?
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();
}
答案 0 :(得分:13)
按钮的clicked
信号可以直接连接到应用程序的quit
位置:
QObject::connect(quitButton, SIGNAL(clicked()),
QApplication::instance(), SLOT(quit()));
答案 1 :(得分: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);
如果这种看起来很疯狂的东西在旋转你的头脑,那就不要出汗了。你可以在这里评论问题,因为我通常每天检查一次,或者至少现在检查一下。
答案 2 :(得分:0)
void my_exit_func()
{
// in mainwindow.cpp
delete MainWindow;
}