Qt c++和Qml信号槽连接

Posted

技术标签:

【中文标题】Qt c++和Qml信号槽连接【英文标题】:Qt c++ and Qml signal and slot connection 【发布时间】:2016-08-19 09:46:05 【问题描述】:

我为我的项目创建了一个 qt 小部件。按钮,信号和插槽,线程一切正常,我也得到了输出。

对话框.h

public slots:

    void startThread();
    void stopThread();
;

#endif // DIALOG_H

对话框.cpp

void  Dialog:: startThread()

    if(!startThreadflag)

    this->ui->Start_2->setEnabled(false);
    this->ui-> Stop_2->setEnabled(true);

    startThreadflag = true;
    stopThreadflag = false;

    


void Dialog:: stopThread()

    if(!stopThreadflag)
            cout << "Closing threads"<< endl;

        this->ui->Start_2->setEnabled(true);
        this->ui->Stop_2->setEnabled(false);

        stopThreadflag= true;
        startThreadflag = false;
    


void Dialog::on_Close_clicked()

    cout<<"close_clicked"<<endl;

    this->close();

为了创建仪表板的目的,我在 qml 中开发了相同的 ui,当我按下按钮信号和插槽连接时,信号和插槽都连接了。但我不知道如何连接标签按钮,设置启用。

那是 qt 小部件代码。在那个 dialog.cpp 和 qml 的下方

对话框.cpp

void Dialog::startThread()

    cout<<"Start Clicked"<<endl;

    emit startbuttonclicked();


void Dialog::stopThread()

    cout<<"Stop Clicked"<<endl;

    emit stopbuttonclicked();

dashboard.qml :(就像所有按钮一样)

               Item 
              Dialog  
                 id: dialog1;
                  
                 Button 
                     x:220
                     y:295
                     text: "Start"
                     onClicked:  dialog1.startThread() 
                     
                 

【问题讨论】:

【参考方案1】:

指定函数返回的变量类型 main() 必须返回一个整数

QApplication 实例化之前没有缩放。

     QGuiApplication app(argc, argv);

    QFontDatabase::addApplicationFont(":/fonts/DejaVuSans.ttf");
    app.setFont(QFont("DejaVu Sans"));
// Now I am using Dialog like context property in qml
// qmlRegisterType<Dialog>("CustomExtensions",1,0,"Dialog");
Dialog dlg;
QQmlApplicationEngine engine;

// Now in qml we can access to dlg by "dialogObj" name

engine.rootContext()->setContextProperty("dialogObj", &dlg);
engine.load(QUrl(QStringLiteral("qrc:/qml/dashboard.qml")));

//QQmlApplicationEngine engine(QUrl("qrc:/qml/dashboard.qml"));       ``

使用它,您可以使用 qml 访问 Qt 信号和插槽

【讨论】:

没错,感谢您的回答。在主函数中,我可以使用它,但是从 qt c++ 是否可以访问插槽? 是的@JerwinPrabuA,您可以使用不变量从 qml 信号访问 qt 插槽 我试过了,现在我可以从 qml 访问到 qt c++。非常感谢【参考方案2】:

在你的 QML 文件中创建一个函数来启用/禁用你的标签

function enableStart_2(enable)

    Start_2.enabled = enable;

然后您需要将 Qt 信号连接到 QML 插槽,例如(连接器继承QObjectQObject::connect(&amp;connector, SIGNAL(enableStart_2(QVariant)), window, SLOT(enableStart_2(QVariant)));

这是您将信号发送到 QML 插槽的方式 emit enableStart_2(true);

更新

例如:你的

onClicked:  dialog1.startThread() 

一定是这样的

onClicked:  startThread() 

startThread() 是在您的 QML 文件中定义的 QML 信号,例如 signal startThread()

您需要将 QML 信号连接到 C++ 代码中的插槽:

QObject::connect(window, SIGNAL(startThread()), &foo, SLOT(onStartThread()));

现在您需要在 Foo 类中定义一个插槽:

class Foo : public QObject

    Q_OBJECT
public slots:
    void onStartThread(void);
;

在函数onStartThread 的定义中,你开始你的线程。

【讨论】:

我已经尝试过,但我得到了相同的输出。我已经连接了信号和插槽。在 qt 小部件中,我们可以使用 this->ui->Start_2->setEnabled(true);在 dialog.cpp 中。在 qml 如何使用源文件连接? 你卡在哪里了?你见过this,尤其是“连接到 QML 信号”部分吗? 是的,我看到了。连接到 QML 信号 它对您有帮助吗?如果没有,你卡在哪里了? 问题不在信号和插槽中。我已经连接了信号和插槽,当我从仪表板按下开始按钮时,它已到达源文件,并且连接的信号插槽也被打印出来。 (问题)现在我想设置启用其他标签。【参考方案3】:

我已经找到了解决方案。使用他可以启用特定按钮。

 Connections 
               target:dialogObj
               onStart_2EnabledChanged: 
               startBtn.enabled = state
              
                onStop_2EnabledChanged: 
                stopBtn.enabled = state
              
         

【讨论】:

以上是关于Qt c++和Qml信号槽连接的主要内容,如果未能解决你的问题,请参考以下文章

Qt c++ 信号槽不能正常工作

C++框架编程Qt 的 信号与槽 简单了解!

QT信号槽连接语法总结

C++框架_之Qt的信号和槽的详解

C++ GUI Qt的建立连接,信号和槽

Qt源码阅读 信号槽的连接与调用