【问题标题】:Qt Error: Signal QDeclarativeEngine::quit() emitted, but no receivers connected to handle itQt 错误:发出信号 QDeclarativeEngine::quit(),但没有连接接收器来处理它
【发布时间】:2012-05-01 15:08:47
【问题描述】:

我对 Qt 很陌生,所以我无法弄清楚一些 Qt 问题。如果有人可以帮助我,我将不胜感激。

我试图摆脱应用程序窗口的框架并在 qml 中创建一个退出按钮以退出应用程序。因此,我编写了一个程序如下:

main.cpp

 #include <QtGui/QApplication>
 #include <QDeclarativeContext>
 #include <QObject>
 #include "qmlapplicationviewer.h"
 #include "myclass.h"
 #include "mainwindow.h"

 Q_DECL_EXPORT int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     MyClass myClass;
     MainWindow window;

     window.rootContext()->setContextProperty("myObject", &myClass);
     window.show();

     return app.exec();
 }

主窗口.cpp

 #include "mainwindow.h"

 MainWindow::MainWindow(QWidget *parent) : QDeclarativeView(parent)
 {
     // No window decorations
     setWindowFlags(Qt::FramelessWindowHint);

     // Set QML file
     setSource(QUrl::fromLocalFile("qml/Test2/main.qml"));
 }

 // Destructor.
 MainWindow::~MainWindow()
 {
 }

myclass.cpp

 #include <QDeclarativeEngine>
 #include <QDeclarativeComponent>
 #include <QDeclarativeContext>
 #include <stdio.h>
 #include "myclass.h"

 MyClass::MyClass()
 {
     click_count = 0;
 }

 int MyClass::click_function(void)
 {
     click_count++;
     fprintf(stderr, "CLICK COUNT in CPP: %d\n", click_count);
     return click_count;
 }

qml

 MouseArea {
     id: mouse_exit
     anchors.fill: parent
     onClicked: {
         console.log("Click on exit button: ")
         console.log("click count: ", myObject.click_function())
         Qt.quit();
     }
 }

它编译成功,但是,每当我单击退出按钮时,就会出现 Qt 错误“Signal QDeclarativeEngine::quit() 发出,但没有连接到处理它的接收器”。根据我在网上搜索这个问题,似乎我必须将 QDeclarativeEngine::quit() 信号连接到 QApplication::quit() 插槽。但是没有太多关于使用 connect() 函数的信息。我尝试了很多方法来使用 connect(),但我仍然不知道如何在这种情况下使用它。

谁能帮我解决这个问题?我真的很感激!

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

    语法是:

    connect(sender, SIGNAL(signalName(args)), receiver, SLOT(slotName(args)));
    

    你可以把它放在你的 MyClass 构造函数中:

    connect(this, SIGNAL(quit()), qApp, SLOT(quit()));
    

    或者在主函数中,因为connect() 是一个静态函数,正如 Slavic81 在下面的评论中指出的那样。

    请注意,qApp 是全局应用程序的宏。

    【讨论】:

    • 其实可以进入main函数。这是一个静态函数。当您在 QObject 之外使用它时,您只需要显式声明该类。像这样:QObject::connect(this, SIGNAL(quit()), qApp, SLOT(quit()));
    • 是的,它有效。不过,显然你不能在 main 中使用 this。那应该是window.rootContext()-&gt;engine(),但我现在编辑我的评论为时已晚。
    • @Slavik81 完美!!!非常感谢您指出 window.rootContext()->engine()。我的 connect() 中的错误发件人是上述问题的原因,因为我使用 &window 作为发件人。现在,使用“QObject::connect(window.rootContext()->engine(), SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit()));”完美运行。非常感谢。我很感激!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2023-01-01
    • 1970-01-01
    相关资源
    最近更新 更多