Управление Qt QML SwipeView с сигналами / слотами

Я очень новичок в Qt и сейчас пытаюсь понять, как изменить индекс SwipeView с помощью другого класса C ++. Я хотел бы сделать какой-то сигнал, исходящий от класса C ++, говорящий «Swipe Right» или что-то в этом роде, с ответом SwipeView. Я также плохо знаком с сигналами и слотами, так что я могу неправильно понять, как они работают.

0

Решение

Когда вы хотите контролировать QML элемент из C ++ лучшая стратегия заключается в создании QObject который имеет Q_PROPERTY, слот и сигналы и экспортировать его в QML через setContextProperty()и выполнить прямую привязку или использовать соединения для подключения сигналов, в этом случае необходимо только излучать сигнал и подключать его в QML,

В следующем примере я показываю, как перейти вправо или влево с помощью QPushButton:

main.cpp

#include <QApplication>
#include <QPushButton>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QHBoxLayout>

class SwipeManager: public QObject{
Q_OBJECT
public:
using QObject::QObject;
public slots:
void moveToRight(){
emit toRight();
}
void moveToLeft(){
emit toLeft();
}
signals:
void toRight();
void toLeft();
};

int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

QApplication app(argc, argv);
SwipeManager manager;

QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("manager", &manager);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;

QWidget w;
QPushButton left("to left");
QPushButton right("to right");
QHBoxLayout *lay = new QHBoxLayout(&w);
lay->addWidget(&left);
lay->addWidget(&right);
QObject::connect(&left, &QPushButton::clicked, &manager, &SwipeManager::moveToLeft);
QObject::connect(&right, &QPushButton::clicked, &manager, &SwipeManager::moveToRight);
w.show();

return app.exec();
}

#include "main.moc"

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.4

Window {
visible: true
width: 640
height: 480
title: qsTr("SwipeView Test")

SwipeView {
id: view
anchors.fill: parent
currentIndex: 4
Repeater {
model: 10
Loader {
active: SwipeView.isCurrentItem || SwipeView.isNextItem || SwipeView.isPreviousItem
sourceComponent: Item{
Text {
text: "Page: "+index
anchors.centerIn: parent
}
}
}
}
}
Connections{
target: manager
onToRight: if(view.currentIndex + 1 != view.count) view.currentIndex += 1
onToLeft: if(view.currentIndex != 0) view.currentIndex -= 1
}

PageIndicator {
id: indicator

count: view.count
currentIndex: view.currentIndex

anchors.bottom: view.bottom
anchors.horizontalCenter: parent.horizontalCenter
}
}

Полный пример можно найти в следующем ссылка на сайт.

0

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

Других решений пока нет …

По вопросам рекламы [email protected]