Соединение сигналов и слотов Qt c ++ и Qml

Я создал виджет 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, сигнал и слот все, что связано, когда я нажимаю кнопку сигнала и слот подключен. Но я не знаю, как подключить кнопку метки, установите включен.

это код виджета QT. ниже этого 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() }
}
}

0

Решение

Указывает тип переменной, которую возвращает функция
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"));       ``

Используя это, вы можете получить доступ к сигналу Qt и слоту с помощью qml.

0

Другие решения

Создайте функцию в своем файле 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 Вы начинаете свою тему.

0

Я нашел решение для этого. используя его можно включить конкретную кнопку.

 Connections {
target:dialogObj
onStart_2EnabledChanged: {
startBtn.enabled = state
}
onStop_2EnabledChanged: {
stopBtn.enabled = state
}
}
0
По вопросам рекламы [email protected]