Qt c++与Qml信号与槽的连接
Qt c++ and Qml signal and slot connection
我已经为我的项目创建了一个 qt 小部件。按钮、信号和插槽、线程一切正常,我也已获取输出。
Dialog.h
public slots:
void startThread();
void stopThread();
};
#endif // DIALOG_H
dialog.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 widget代码。低于 dialog.cpp 和 qml
dialog.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() }
}
}
在您的 QML 文件中创建一个函数以 enable/disable 您的标签
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:
class Foo : public QObject
{
Q_OBJECT
public slots:
void onStartThread(void);
};
在函数的定义中 onStartThread
你启动你的线程。
我已经找到了解决方案。使用他可以启用特定按钮。
Connections {
target:dialogObj
onStart_2EnabledChanged: {
startBtn.enabled = state
}
onStop_2EnabledChanged: {
stopBtn.enabled = state
}
}
指定变量类型的函数returns
main() 必须 return 一个整数
在实例化 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 小部件。按钮、信号和插槽、线程一切正常,我也已获取输出。
Dialog.h
public slots:
void startThread();
void stopThread();
};
#endif // DIALOG_H
dialog.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 widget代码。低于 dialog.cpp 和 qml
dialog.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() }
}
}
在您的 QML 文件中创建一个函数以 enable/disable 您的标签
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:
class Foo : public QObject
{
Q_OBJECT
public slots:
void onStartThread(void);
};
在函数的定义中 onStartThread
你启动你的线程。
我已经找到了解决方案。使用他可以启用特定按钮。
Connections {
target:dialogObj
onStart_2EnabledChanged: {
startBtn.enabled = state
}
onStop_2EnabledChanged: {
stopBtn.enabled = state
}
}
指定变量类型的函数returns main() 必须 return 一个整数
在实例化 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 信号和槽