6

quit()メソッドを直接使用しようとすると、完全にコンパイルされますが、実行時に「Object :: connect:No such slot 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();
}
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には2つのオーバーロードがあるため、これはもう1つのオーバーロードです。

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 に答える