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 插槽,例如(连接器继承QObject
)
QObject::connect(&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信号槽连接的主要内容,如果未能解决你的问题,请参考以下文章