2013-05-24 21 views
6

Tôi biết rằng sử dụng cơ chế tín hiệu và khe của Qt bên trong một lớp, lớp phải bao gồm macro Q_OBJECT, nhưng tôi đang cố gắng sử dụng tín hiệu và vị trí trong main() mà không sử dụng bất kỳ lớp nào.Không thể kết nối tín hiệu với chức năng bên trong main()

Đây là mã của tôi cho đến nay:

#include <QApplication> 
#include <QWidget> 
#include <QTextEdit> 
#include <QtGui> 

void saveText(); 

int main(int argv, char **args) 
{ 
    QApplication app(argv, args); 
    QTextEdit textEdit; 
    QPushButton saveButton("Save!"); 
    QPushButton exitButton("Exit!"); 
    QObject::connect(&exitButton,SIGNAL(clicked()),qApp,SLOT(quit())); 
    QObject::connect(&saveButton,SIGNAL(clicked()),qApp,SLOT(saveText())); 

    QVBoxLayout vlyt; 
    vlyt.addWidget(&textEdit); 
    vlyt.addWidget(&exitButton); 
    vlyt.addWidget(&saveButton); 

    QWidget mainWindow; 
    mainWindow.setLayout(&vlyt); 
    mainWindow.show(); 

    return app.exec(); 
} 

void saveText() 
{ 
    exit(0); 
} 

Đây là cửa sổ GUI tạo:

GUI window

Từ đoạn code trên, nút thoát được kết nối với quit(), mà là một Qt chức năng, khi nhấp vào nó hoạt động. Nút lưu được gán cho hàm saveText(), được định cấu hình để thoát nhưng không làm như vậy.

Hãy cho tôi biết tôi đã đi sai trong việc hiểu tín hiệu và vị trí trong Qt.

Trả lời

7

Qt4 ...

Tất cả các lớp kế thừa từ QObject hoặc một trong các lớp con của nó (ví dụ, QWidget) có thể chứa các tín hiệu và khe cắm. 1

Vì vậy, bạn không thể khe sử dụng khi đặt bên ngoài của QObject trẻ em.

Bạn có thể kết nối tín hiệu với các vị trí nằm trong các lớp bắt nguồn từ QObject. Đặt khe của bạn trong một lớp học mà là trong một tách .h/cpp file:

class MyClass : public QObject 
{ 
    Q_OBJECT 

    ... 

    public slots: 
    void saveText(); 

}; 

Theo Qt5: New Signal Slot Syntax in Qt 5. Bạn có thể kết nối với các loại chức năng toàn cục đó. (Nhờ nhận xét của @ thuga)

+0

Vậy tại sao là nút thoát làm việc? Có phải hàm 'quit()' nằm trong một lớp kế thừa từ QObject không? – CodeCrusader

+0

'quit()' là một khe bên trong 'qApp' và' qApp' là một đối tượng bắt nguồn từ 'QObject'. – deepmax

+0

Ok, bây giờ rõ ràng .. – CodeCrusader

2

Tôi sẽ chỉ đưa ví dụ vào đây.

main.cpp:

#include <QCoreApplication> 
#include <iostream> 
#include <QObject> 
#include "siggen.h" 

void handler(int val){ 
    std::cout << "got signal: " << val << std::endl; 
} 

int main(int argc, char *argv[]) 
{ 
    SigGen siggen; 
    QObject::connect(&siggen, &SigGen::sgAction, handler); 
    siggen.action(); 

    QCoreApplication a(argc, argv); 
    std::cout << "main prog start" << std::endl; 

    return a.exec(); 
} 

siggen.h:

#ifndef SIGGEN_H 
#define SIGGEN_H 

#include <QObject> 

class SigGen : public QObject 
{ 
    Q_OBJECT 

public: 
    explicit SigGen(QObject *parent = 0); 
    void action(void); 

signals: 
    void sgAction(int value); 
}; 

#endif // SIGGEN_H 

siggen.cpp:

#include "siggen.h" 

SigGen::SigGen(QObject *parent) : QObject(parent) 
{} 

void SigGen::action() 
{ 
    emit sgAction(42); 
} 
Các vấn đề liên quan