2013-05-24 15 views
5

自分自身がQtでボタンに関数を接続するプログラムを書き込もうとしています。ボタンを任意の関数に接続する

#include <QApplication> 
#include <QtGui> 
#include <QPushButton> 
static void insert() 
{ 
    qDebug() << “pressed”; 
} 

int main(int argc,char *argv[]) 
{ 
    QApplication app(argc,argv); 
    QPushButton *button=new QPushButton(“button”); 
    button->setGeometry(50,100,150,80); 
    QObject::connect(button,&QPushButton::clicked,insert()); 
    button->show(); 
    } 

しかし、私は main.cc:23:39のようなエラーが取得しています。エラー:このコンテキスト内 main.cc:23:55:エラー:無効表現 メイクの無効な使用:*を[ main.o]エラー1

は...

+1

の出力が表示されない場合があります)' 'には、挿入する。 – Jichao

+0

私はQtについて知っていませんが、あなたの関数呼び出し 'QObject :: connect'は、ここで与えられたプロトタイプ[Qt](http://qt-project.org/doc/qt-4.8/qobject.html)と一致しません。 –

+0

また、 'main'関数の最後に' return app.exec() 'がなければこれがうまくいくとは思えません。 – Amartel

答えて

2

* はできませんので、すべての

まず下の編集を参照してください助けてください関数にシグナルを接続する場合、それをあるクラスのスロットに接続し、このクラスのインスタンスをQObject::connectにも提供する必要があります。

だから、まず最初に行うには、スロットを持つクラスを定義することです。このクラスはQObjectを継承し、その中Q_OBJECTキーワードを持っている必要があること

// file 'C.h' 
#ifndef __C_H__ 
#define __C_H__ 

#include <QtGui> 

class C : public QObject{ 
    Q_OBJECT 

public slots: 
    static void insert() 
    { 
     qDebug() << "pressed"; 
    } 
}; 

#endif 

は注意してください。 *.hファイルにこのクラス宣言を入れなければなりません(Qtには表示されないため、ファイル*.cppにはQ_OBJECTを含めることはできません)。

今、あなたはスロットを持つクラスを持っていることを、あなたはQObject::connectを使用することができ、適切な方法は次のようになります。あなたが接続したときに、シグナルとスロットのためSLOT()マクロのSIGNAL()マクロを使用する必要が

QObject::connect(button, SIGNAL(clicked()), &c, SLOT(insert())); 

注意それら。次のように

だからmain.cppのコードは次のようになります。私はconnect()機能へのレシーバ・オブジェクト(&c)のインスタンスをどのように提供するかあなたが見

#include "C.h" 

    int main(int argc,char *argv[]) 
    { 

     QApplication app(argc,argv); 
     QPushButton *button=new QPushButton("button"); 
     button->setGeometry(50,100,150,80); 
     C c; 
     QObject::connect(button, SIGNAL(clicked()), &c, SLOT(insert())); 
     button->show(); 

     return app.exec(); 
    } 

を、あなたの関数がstaticであっても、それをしなければなりません。

最後に、app.exec();にする必要があります。そうしないと、プログラムにメッセージループが発生しないためです。

EDIT:

私は質問の答えが間違っているのQt 5.0の場合はQt 5程度であったことを逃しました。

+3

これは間違っています。 OPがQt5を指定している可能性があります。 – UmNyobe

+0

@UmNyobeありがとうございます。私はそれがQt5.0に関することを完全に逃した –

8

Qt 5では、新しいqt signal and slots systemを使用する必要があります。接続は次のようになります。

QObject::connect(button,&QPushButton::clicked,insert); <-- no parentheses. 

これは、すでに述べてきたが、あなたはイベントループ処理を開始するapp.exec();を呼び出す必要があります。さもなければ、接続は決して引き起こされません。さらに

、あなたはリリースモードであるならば、あなたは、私はQT 5について多くを知らないが、私はあなたが(挿入 `でparathesisを削除する必要があると思うqDebug()

+0

Qt 5.4を使用しているにもかかわらず、 'spinBox:後ろに::が続くとクラスまたは名前空間でなければならないというエラーをスローします。 – CroCo

関連する問題