2013-02-23 36 views
5

nếu tôi cố gắng sử dụng phương thức quit() trực tiếp, nó được biên dịch hoàn hảo, tuy nhiên trong thời gian chạy có lỗi "Object :: connect: No myClass :: quit() . " để tránh điều này, có cách nào không? bằng cách sử dụng phương thức quitPicture() (được định nghĩa là vị trí) ứng dụng đang hoạt động tốt. là giải pháp duy nhất này?gọi phương thức quit() của QApplication

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(); 
} 

Trả lời

11

tín hiệu clicked của nút có thể được kết nối trực tiếp đến quit khe của ứng dụng:

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

cảm ơn bạn rất nhiều. nó hoạt động :) – suma

0

câu trả lời này bao gồm cú pháp tín hiệu mới/khe trong Qt và cũng bao gồm thêm làm thế nào để xử lý nó khi sử dụng một tín hiệu sử dụng quá tải.

Đối với tín hiệu không có quá tải sử dụng QObject như một đối tượng dụ:

QObject obj(nullptr); 

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

Đối với tín hiệu với quá tải sử dụng QProcess như một đối tượng dụ:

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

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

Đó cú pháp điên nhìn về cơ bản là này, làm cú pháp giữ chỗ:

static_cast< _signalReturnType_(_ObjectName::*_)(_overloadType1_, _overloadType2_, \ 
…etc)>(_&ObjectName::signalName_) 

Bạn có thể xem this link nếu bạn muốn biết chi tiết về lý do tại sao.

Kể từ QProcess có hai quá tải, đây là tình trạng quá tải khác cho nó:

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

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

Nếu công cụ này điên hình dáng như quay đầu của bạn, đừng lo lắng. Bạn có thể bình luận câu hỏi ở đây, vì tôi thường kiểm tra SO hàng ngày, hoặc ít nhất là ngày nay.

0
void my_exit_func() 
{ 
    // in mainwindow.cpp 
    delete MainWindow; 
} 
Các vấn đề liên quan