QGC中MainWindow与QML

xiaoxiao2021-02-28  91

对QGC主窗口的学习

在ui\MainWindow.h中 构造方法被定义成私有的。

在QGCApplication.cc中__initForNormalAppBoot()中 创建窗口,不是new MainWindow,也是由于构造方法是私有的 采用 MainWindow *mainWindow=MainWindow::__create();方式创建

在_initForNormalAppBoot(void)执行时候:

QSettings settings; _loadCurrentStyleSheet(); //上一个窗口关闭时候退出main application connect(this,&QGCApplication::lastWindowClosed,this,QGCApplication::quit);

在MainWindow的构造方法中,

_instance=this; loadSettings(); emit initStatusChanged(tr('xxx'),Qt::AlignLeft|Qt::AlignBottom,QColor(62,93,141)); _ui.setupUi(this);

//确保在改变最小宽度之前,确保所有tool bar elements都fit

setMinimumWidth(1008); configureWindowName(); //使用QVBoxLayout这个widget来装所有view _centralLayout=new QVBoxLayout(); _centralLayout->setContentsMargins(0,0,0,0); centralWidget()->setLayout(_centralLayout);

MainWindowHybrid.qml

Item{ function showSetupView(){ mainWindowInner.item.showSetupView() } function attemptWindowClose(){ mainWindowInner.item.attemptWindowClose() } function showMessage(message){ mainWindowInner.item.showMessage(message) } }

在上述qml中的方法,在QGCApplication.cc中定义

void QGCApplication::showSetupView(void) { QMetaObject::invokeMethod(_rootQmlObject(), "showSetupView"); } void QGCApplication::qmlAttemptWindowClose(void) { QMetaObject::invokeMethod(_rootQmlObject(), "attemptWindowClose"); } void QGCApplication::showMessage(const QString& message) { // Special case hack for ArduPilot prearm messages. These show up in the center of the map, so no need for popup. if (message.contains("PreArm:")) { return; } QObject* rootQmlObject = _rootQmlObject(); if (rootQmlObject) { QVariant varReturn; QVariant varMessage = QVariant::fromValue(message); QMetaObject::invokeMethod(_rootQmlObject(), "showMessage", Q_RETURN_ARG(QVariant, varReturn), Q_ARG(QVariant, varMessage)); #ifndef __mobile__ } else if (runningUnitTests()){ // Unit test can run without a main window which will lead to no root qml object. Use QGCMessageBox instead QGCMessageBox::information("Unit Test", message); #endif } else { qWarning() << "Internal error"; } }

在ui\MainWindow.h中

_mainQmlWidgetHolder->setContextPropertyObject("controller",this); _mainQmlWidgetHolder- >setContextPropertyObject("debugMessageModel",AppMEssage::getModel()); _mainQmlWidgetHolder->setSource(QUrl::fromUserInput("qrc:qml/MainWindowHybrid.qml"));

因此在qml中有个controller可以用

转载请注明原文地址: https://www.6miu.com/read-84884.html

最新回复(0)