3

実装しようとしているクラスに問題があります。基本的に、クラスが構築されたときにシングルショット タイマーを開始し、それをクラス スロットの 1 つに接続したいと考えています。現時点では、私のコンストラクタは次のようになります。

myclass::myclass(int time)
{
    QTimer::singleShot(time, this, SLOT(myslot()));
}

そして、タイトルにエラーが発生します。myclass が Q_OBJECT でなければならないことはすでにわかりましたが、これでエラーは修正されませんでした。何か案は?前もって感謝します!

4

4 に答える 4

2

QGraphicsItem は QObject を継承しないため、myclass を変更する必要があります

// thanks to WoJo for pointing out the right inheritance order
class myclass : public QObject, public QGraphicsItem
//class myclass : public QGraphicsItem, public QObject
{ Q_OBJECT
...
public slots:
  void myslot();

}

私の経験では、ビルド ディレクトリを削除して、その後クリーン リビルドを強制する必要があります。

于 2013-06-20T12:11:40.287 に答える
1

変化する

QTimer::singleShot(time, this, SLOT(myslot))); // this should give you a syntax error as well

QTimer::singleShot(time, this, SLOT(myslot()));

ただし、注意してください。しばらくしてから独自のメソッドを呼び出すと、多くの問題が発生する可能性があります。そのクラス オブジェクトの何らかの関数を呼び出してタイマーが終了し、 を直接呼び出すと、競合状態になる可能性がありますmyslot()

于 2013-06-20T11:59:15.157 に答える
1

すでに与えられた回答の多くが指摘しているように、QGraphicsItem はシグナルとスロットに使用される QObject を継承しません。

ただし、QGraphicsItem および QObject で多重継承を使用するのではなく、Qt クラスQGraphicsObjectから単純に派生させることができます。これは、シグナルとスロットを必要とし、QGraphicsItem から派生した GraphicsItem を提供するように設計されています。また、質問で言及した QTimer 機能も提供します。

于 2013-06-20T13:12:52.900 に答える