1

自分の関数を Qt の関数スロットとして呼び出そうとしていますが、その方法がわかりません。次のアプローチが間違っているようです:

更新: 回答によると、ソース コードを更新しましたが、それでも何か問題があるようです。このコード スニペットをコンパイルしようとすると、次のエラーが発生します。

C2515:「適切な既定のコンストラクターがありません。」

C2665: QObject::connect':3 つのオーバーロードのどれも、すべての引数を変換できませんでした。

それぞれVisual Studio 2010で。

#include <QtGui/QApplication>
#include <QPushButton>
#include <QObject>
#include <QMessageBox>

class myclass;
int main(int argc,char *argv[])
{
    QApplication a(argc,argv);

    QPushButton btnshowmessage("show");
    myclass *my=new myclass();
    QObject::connect(&btnshowmessage,SIGNAL(clicked()),my,SLOT(warningmessage()));
    btnshowmessage.show();
    return a.exec();
}
//////////////////////////////////////////////////////////////////////////
class myclass: public QObject
{
Q_OBJECT
public:myclass(){}

        public slots:
            void warningmessage()
            {
                QMessageBox::warning(0,"Warning","Test Message!",QMessageBox::Ok);
            }
};
4

2 に答える 2

5

信号とスロットを使用して、あるオブジェクトの信号を別のオブジェクトのスロットに接続します。すべてのシグナルまたはスロットは、クラスから派生し、マクロQObjectを含む必要があるクラス内にある必要があります。Q_OBJECT

したがって、コードを機能させるには、スロットを自分のクラスに入れます。

class MySlotClass:public QObject
{
Q_OBJECT
public slots:
void MyFunction()
    {
        QMessageBox::warning(0,"WarningTest","This is a waring text message",QMessageBox::Ok);
    }
}

次のように接続します。

MySlotClass m = new MySlotClass();
Qobject::connect(&btnShowaMessageBox,SIGNAL(clicked()), &m ,SLOT(MyFunction()));
于 2012-08-24T11:18:22.600 に答える
2

現在、Qtは、一部のQObject派生物でスロットとして宣言されていない関数へのシグナルの接続を許可していません。Qt5はこの可能性を提供すると思いますが、connectはこれを可能にするために異なる構文を持ちます。

基本的に、スロット関数はQObject派生クラスにあり、で宣言されている必要があります

public slots:

セクション。

シグナル/スロットに関するドキュメントをお読みください。

于 2012-08-24T11:16:59.817 に答える