QObject :: connect:没有这样的信号。此外,Qtimer没有打电话

时间:2015-11-09 13:07:01

标签: c++ qt qml qt-quick

我有一个班级,myClass:

class myClass : public QObject
{
  Q_OBJECT
public:
QQuickWidget* widget;
QString mystring;
myClass (QQuickWidget* quickWidget, QString string);
void myfunction();

public slots:
void slot();
signals:
void clicked();
};

myClass::myClass(QQuickWidget* quickWidget, QString string) : widget(quickWidget), mystring(string)
{
QTimer::singleShot(60000, this, SLOT(slot()));
myfunction();
}

void myClass::slot()
{

}

void myClass::myfunction()
{
widget->setVisible(true);
widget->setSource(QUrl("qrc:/qmlsource.qml"));
connect(widget, SIGNAL(clicked()), this, SLOT(slot()));
}

我想要做的是在创建myClass对象60秒后调用slot()函数。这并没有发生。此外,在连接线我得

QObject::connect: No such signal QQuickWidget::clicked()

消息。

如果有人可以帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

所以,我认为你在这里有一些问题。

<强> 1。 QWidget的

最重要的是QWidget(QQUickWidget继承自)没有一个名为&#34;点击&#34;的信号,所以消息QObject::connect: No such signal QQuickWidget::clicked()非常正确;)

您需要做的是创建自己的对象,该对象继承自QQuickWidget,然后重新实现/重载函数void QWidget::mousePressEvent(QMouseEvent * event)和/或void QWidget::mouseReleaseEvent(QMouseEvent * event)

这些是在窗口小部件中调用的函数,然后您可以发出信号。这意味着您还需要向您的小部件添加新信号。所以你的新类标题看起来有点像(只包括主要元素):

class MyQQuickWidget: public QQuickWidget
{
    Q_OBJECT

public:
    MyQQuickWidget(QWidget *parent = 0);

signals:
    void clicked();

protected:
    void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
    void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;

};

然后在您的实施中:

void MyQQuickWidget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        emit clicked();
    }
}

然后当您将MyQQuickWidget信号单击()连接到MyClass插槽()时,它将连接正常。

<强> 2。 QTimer

看起来您的计时器应该触发...但是插槽slot()中似乎没有调试,那么您如何知道这是否有效?