2013-05-24 6 views
6

Qtのシグナルとスロットのメカニズムをクラス内で使用するには、クラスにQ_OBJECTマクロが含まれている必要がありますが、信号とスロットをmain() 、クラスを使用せずに。ここでmain()内の関数にシグナルを接続できません

は、これまでの私のコードです:ここでは

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

は、生成されたGUIウィンドウである:上記のコードから

GUI window

、終了ボタンがある、quit()に接続されていますQt関数をクリックすると動作します。ファンクションsaveText()に割り当てられた保存ボタンは、終了するように設定されていますが、終了しません。

Qtの信号とスロットの理解に間違ったところを教えてください。

答えて

7

Qt4版は...

QObjectを継承またはそのサブクラス(例えば、 QWidgetの)のすべてのクラスシグナルとスロットを含むことができます。 1

だから、あなたことはできませんQObject子供の外に置かれ使用スロット。

QObjectから派生したクラスにあるスロットに信号を接続できます。 New Signal Slot Syntax in Qt 5:Qt5によると

class MyClass : public QObject 
{ 
    Q_OBJECT 

    ... 

    public slots: 
    void saveText(); 

}; 

:分離の.h/.cppのファイル内にあるクラスでは、あなたのスロットを入れてください。これらのタイプのグローバル関数に接続することができます。 (@ thugaさんのコメントのおかげで)

+0

なぜ終了ボタンの作業はありますか? QObjectから継承したクラスの中に 'quit()'関数がありますか? – CodeCrusader

+0

'quit()'は 'qApp'内のスロットで、' qApp'は 'QObject'から派生したオブジェクトです。 – deepmax

+0

Ok、今はそのクリア.. – CodeCrusader

2

ここに例を載せておきます。

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); 
} 
関連する問題