Как подключить сигнал в c++ в qml в плазмоиде?
Мне нужно подключить сигнал из c++ в qml. Я делаю это так:
Connections{
target: Plasmoid.nativeInterface
onStateChanged: {
serverState.text = Plasmoid.nativeInterface.state
}
onPlayersChanged: {
players.text = Plasmoid.nativeInterface.players
}
}
но надпись не меняется. Как правильно подключить сигнал?
main.qml:
/*
SPDX-FileCopyrightText: 2021 Dmitry Safronov <[email protected]>
SPDX-License-Identifier: LGPL-2.1-or-later
*/
import QtQuick 2.1
import QtQuick.Layouts 1.1
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.components 2.0 as PlasmaComponents
Item {
width: 250
height: 200
Connections{
target: Plasmoid.nativeInterface
onStateChanged: {
serverState.text = Plasmoid.nativeInterface.state
}
onPlayersChanged: {
players.text = Plasmoid.nativeInterface.players
}
}
PlasmaComponents.Label{
id: serverStateLbl
text: "Состояние сервера:"
x: 10
y: 10
width: 130
height: 20
}
PlasmaComponents.Label{
id: serverState
text: Plasmoid.nativeInterface.state
color: "red"
onTextChanged: {
if(serverState.text === "Выключен") serverState.color = "red"
else if(serverState.text === "Включается" | serverState.text === "Выключается") serverState.color = "yellow"
else if(serverState.text === "Включен") serverState.color = "green"
}
x: 140
y: 10
width: 60
height: 20
}
PlasmaComponents.Label{
id: playersLbl
text: "Игроки:"
x: 10
y: 40
width: 100
height: 20
}
PlasmaComponents.Label{
id: players
text: Plasmoid.nativeInterface.players
x: 110
y: 40
width: 60
height: 20
}
}
serverwidget.h:
/*
SPDX-FileCopyrightText: 2021 Dmitry Safronov <[email protected]>
SPDX-License-Identifier: LGPL-2.1-or-later
*/
#ifndef SERVERWIDGET_H
#define SERVERWIDGET_H
#include <Plasma/Applet>
#include <QTcpServer>
#include <QTcpSocket>
class serverWidget : public Plasma::Applet{
Q_OBJECT
Q_PROPERTY(QString players READ getPlayers NOTIFY playersChanged)
Q_PROPERTY(QString state READ getState NOTIFY stateChanged)
public:
serverWidget(QObject *parent, const QVariantList &args);
~serverWidget();
QString getPlayers();
QString getState();
public slots:
void incommingConnection();
void read();
signals:
void playersChanged();
void stateChanged();
private:
QString players;
QString state;
void setPlayers(QString players);
void setState(QString state);
QTcpServer *server;
QTcpSocket *plugin;
};
#endif
serverwidget.cpp:
/*
SPDX-FileCopyrightText: 2021 Dmitry Safronov <[email protected]>
SPDX-License-Identifier: LGPL-2.1-or-later
*/
#include "serverwidget.h"
serverWidget::serverWidget(QObject *parent, const QVariantList &args)
: Plasma::Applet(parent, args)
{
server = new QTcpServer();
server->listen(QHostAddress::Any, 30779);
connect(server, SIGNAL(newConnection()), this, SLOT(incommingConnection()));
state = "Выключен";
}
serverWidget::~serverWidget(){
delete server;
delete plugin;
}
void serverWidget::incommingConnection(){
plugin = server->nextPendingConnection();
connect(plugin, SIGNAL(readyRead()), this, SLOT(read()));
}
void serverWidget::read(){
QByteArray data = plugin->readAll();
QString answerWithVar = QString::fromUtf8(data);
QString var;
foreach(QChar c, answerWithVar){
if(c != ":") var.append(c);
else break;
}
QString answer = answerWithVar.replace(var + ":", "");
qInfo() << var + ": " + answer;
if(var.contains("players")) setPlayers(answer);
else if(var.contains("state")) setState(answer);
}
void serverWidget::setPlayers(QString players){
this->players = players;
emit playersChanged();
}
void serverWidget::setState(QString state){
this->state = state;
emit stateChanged();
}
QString serverWidget::getPlayers(){ return players; }
QString serverWidget::getState(){ return state; }
K_EXPORT_PLASMA_APPLET_WITH_JSON(serverwidget, serverWidget, "metadata.json")
#include "serverwidget.moc"
Изпользую Qt 5.15.2