Commit 15a15098 authored by lm's avatar lm

Significantly bugfixed persistence and link adding/removal. Not yet fully...

Significantly bugfixed persistence and link adding/removal. Not yet fully there, but getting closer to release
parent 55cdf5db
......@@ -150,7 +150,8 @@ FORMS += src/ui/MainWindow.ui \
src/ui/SlugsHilSim.ui \
src/ui/SlugsPIDControl.ui \
src/ui/SlugsVideoCamControl.ui \
src/ui/SlugsPadCameraControl.ui
src/ui/SlugsPadCameraControl.ui \
src/ui/uas/QGCUnconnectedInfoWidget.ui
INCLUDEPATH += src \
src/ui \
......@@ -251,7 +252,8 @@ HEADERS += src/MG.h \
src/ui/SlugsVideoCamControl.h \
src/ui/SlugsPadCameraControl.h \
src/ui/QGCMainWindowAPConfigurator.h \
src/comm/MAVLinkSwarmSimulationLink.h
src/comm/MAVLinkSwarmSimulationLink.h \
src/ui/uas/QGCUnconnectedInfoWidget.h
contains(DEPENDENCIES_PRESENT, osg) {
message("Including headers for OpenSceneGraph")
......@@ -363,7 +365,8 @@ SOURCES += src/main.cc \
src/ui/SlugsVideoCamControl.cpp \
src/ui/SlugsPadCameraControl.cpp \
src/ui/QGCMainWindowAPConfigurator.cc \
src/comm/MAVLinkSwarmSimulationLink.cc
src/comm/MAVLinkSwarmSimulationLink.cc \
src/ui/uas/QGCUnconnectedInfoWidget.cc
contains(DEPENDENCIES_PRESENT, osg) {
message("Including sources for OpenSceneGraph")
......
......@@ -66,7 +66,7 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv)
{
this->setApplicationName(QGC_APPLICATION_NAME);
this->setApplicationVersion(QGC_APPLICATION_VERSION);
this->setOrganizationName(QLatin1String("PIXHAWK Association Zurich"));
this->setOrganizationName(QLatin1String("OPENMAV"));
this->setOrganizationDomain("http://qgroundcontrol.org");
// Show splash screen
......@@ -105,10 +105,6 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv)
// Start the user interface
splashScreen->showMessage(tr("Starting User Interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
// Start UI
mainWindow = new MainWindow();
// Remove splash screen
splashScreen->finish(mainWindow);
// Connect links
// to make sure that all components are initialized when the
......@@ -117,7 +113,21 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv)
// Listen on Multicast-Address 239.255.77.77, Port 14550
//QHostAddress * multicast_udp = new QHostAddress("239.255.77.77");
//UDPLink* udpLink = new UDPLink(*multicast_udp, 14550);
mainWindow->addLink(udpLink);
//mainWindow->addLink(udpLink);
#ifdef OPAL_RT
// Add OpalRT Link, but do not connect
OpalLink* opalLink = new OpalLink();
//mainWindow->addLink(opalLink);
#endif
// MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(MG::DIR::getSupportFilesDirectory() + "/demo-log.txt");
MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(":/demo-log.txt");
//mainWindow->addLink(simulationLink);
mainWindow = MainWindow::instance();
// Remove splash screen
splashScreen->finish(mainWindow);
// Check if link could be connected
if (!udpLink->connect())
......@@ -140,15 +150,6 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv)
QTimer::singleShot(200, mainWindow, SLOT(close()));
}
}
#ifdef OPAL_RT
// Add OpalRT Link, but do not connect
OpalLink* opalLink = new OpalLink();
mainWindow->addLink(opalLink);
#endif
// MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(MG::DIR::getSupportFilesDirectory() + "/demo-log.txt");
MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(":/demo-log.txt");
mainWindow->addLink(simulationLink);
}
/**
......
......@@ -67,6 +67,7 @@ LinkManager::~LinkManager()
void LinkManager::add(LinkInterface* link)
{
if(!link) return;
connect(link, SIGNAL(destroyed(QObject*)), this, SLOT(removeLink(QObject*)));
links.append(link);
emit newLink(link);
}
......@@ -127,6 +128,17 @@ bool LinkManager::disconnectLink(LinkInterface* link)
return link->disconnect();
}
void LinkManager::removeLink(QObject* link)
{
LinkInterface* linkInterface = dynamic_cast<LinkInterface*>(link);
// Add link to link list
if (links.contains(linkInterface))
{
int linkIndex = links.indexOf(linkInterface);
links.removeAt(linkIndex);
}
}
bool LinkManager::removeLink(LinkInterface* link)
{
if(link)
......
......@@ -67,6 +67,7 @@ public slots:
void add(LinkInterface* link);
void addProtocol(LinkInterface* link, ProtocolInterface* protocol);
void removeLink(QObject* link);
bool removeLink(LinkInterface* link);
bool connectAll();
......
......@@ -927,6 +927,18 @@ bool MAVLinkSimulationLink::connect()
return true;
}
/**
* Connect the link.
*
* @param connect true connects the link, false disconnects it
* @return True if connection has been established, false if connection
* couldn't be established.
**/
void MAVLinkSimulationLink::connectLink()
{
this->connect();
}
/**
* Connect the link.
*
......
......@@ -87,6 +87,7 @@ public slots:
void readBytes();
virtual void mainloop();
bool connectLink(bool connect);
void connectLink();
protected:
......
......@@ -1532,7 +1532,7 @@ void UAS::addLink(LinkInterface* link)
links->append(link);
}
//links->append(link);
qDebug() << link<<" ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK";
//qDebug() << link<<" ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK ADDED LINK";
}
/**
......
......@@ -125,12 +125,28 @@ void DebugConsole::addLink(LinkInterface* link)
// Register for name changes
connect(link, SIGNAL(nameChanged(QString)), this, SLOT(updateLinkName(QString)));
connect(link, SIGNAL(destroyed(QObject*)), this, SLOT(removeLink(QObject*)));
}
void DebugConsole::removeLink(QObject* link)
{
LinkInterface* linkInterface = dynamic_cast<LinkInterface*>(link);
// Add link to link list
if (links.contains(linkInterface))
{
int linkIndex = links.indexOf(linkInterface);
links.removeAt(linkIndex);
m_ui->linkComboBox->removeItem(linkIndex);
}
if (link == currLink) currLink = NULL;
}
void DebugConsole::linkSelected(int linkId)
{
// Disconnect
if (currLink != NULL)
if (currLink)
{
disconnect(currLink, SIGNAL(bytesReceived(LinkInterface*,QByteArray)), this, SLOT(receiveBytes(LinkInterface*, QByteArray)));
}
......
......@@ -59,6 +59,8 @@ public:
public slots:
/** @brief Add a link to the list of monitored links */
void addLink(LinkInterface* link);
/** @brief Remove a link from the list */
void removeLink(QObject* link);
/** @brief Update a link name */
void updateLinkName(QString name);
/** @brief Select a link for the active view */
......
......@@ -38,6 +38,20 @@
#include "LogCompressor.h"
MainWindow* MainWindow::instance()
{
static MainWindow* _instance = 0;
if(_instance == 0)
{
_instance = new MainWindow();
/* Set the application as parent to ensure that this object
* will be destroyed when the main application exits */
//_instance->setParent(qApp);
}
return _instance;
}
/**
* Create new mainwindow. The constructor instantiates all parts of the user
* interface. It does NOT show the mainwindow. To display it, call the show()
......@@ -82,35 +96,17 @@ MainWindow::MainWindow(QWidget *parent):
connectCommonActions();
// Load mavlink view as default widget set
loadMAVLinkView();
//loadMAVLinkView();
// Adjust the size
adjustSize();
// Load previous widget setup
// // FIXME WORK IN PROGRESS
// QSettings settings(QGC::COMPANYNAME, QGC::APPNAME);
// QList<QDockWidget *> dockwidgets = qFindChildren<QDockWidget *>(this);
// if (dockwidgets.size())
// {
// settings.beginGroup("mainwindow/dockwidgets");
// for (int i = 0; i < dockwidgets.size(); ++i)
// {
// QDockWidget *dockWidget = dockwidgets.at(i);
// if (dockWidget->parentWidget() == this)
// {
// if (settings.contains(dockWidget->windowTitle()))
// {
// dockWidget->setVisible(settings.value(dockWidget->windowTitle(), dockWidget->isVisible()).toBool());
// }
// }
// }
// settings.endGroup();
// }
// // Select the right perspective
// Populate link menu
QList<LinkInterface*> links = LinkManager::instance()->getLinks();
foreach(LinkInterface* link, links)
{
this->addLink(link);
}
// Enable and update view
this->show();
......@@ -398,8 +394,10 @@ void MainWindow::addToToolsMenu ( QWidget* widget,
if (!settings.contains(posKey)){
settings.setValue(posKey,location);
dockWidgetLocations[tool] = location;
} else {
dockWidgetLocations[tool] = static_cast <Qt::DockWidgetArea> (settings.value(posKey).toInt());
}
else
{
dockWidgetLocations[tool] = static_cast <Qt::DockWidgetArea> (settings.value(posKey, Qt::RightDockWidgetArea).toInt());
}
chKey = buildMenuKey(SUB_SECTION_CHECKED,tool, currentView);
......@@ -412,7 +410,7 @@ void MainWindow::addToToolsMenu ( QWidget* widget,
else
{
tempAction->setChecked(settings.value(chKey).toBool());
widget->setVisible(settings.value(chKey).toBool());
widget->setVisible(settings.value(chKey, false).toBool());
}
// connect the action
......@@ -456,7 +454,16 @@ void MainWindow::showTheWidget (TOOLS_WIDGET_NAMES widget, VIEW_SECTIONS view)
Qt::DockWidgetArea tempLocation;
QDockWidget* tempWidget = static_cast <QDockWidget *>(dockWidgets[widget]);
tempVisible = settings.value(buildMenuKey (SUB_SECTION_CHECKED,widget,view)).toBool();
tempVisible = settings.value(buildMenuKey (SUB_SECTION_CHECKED,widget,view), false).toBool();
// Some widgets are per default visible. Overwrite the settings value if not present.
if (widget == MainWindow::MENU_UAS_LIST)
{
if (!settings.contains(buildMenuKey (SUB_SECTION_CHECKED,widget,view)))
{
tempVisible = true;
}
}
if (tempWidget)
{
......@@ -466,9 +473,17 @@ void MainWindow::showTheWidget (TOOLS_WIDGET_NAMES widget, VIEW_SECTIONS view)
//qDebug() << buildMenuKey (SUB_SECTION_CHECKED,widget,view) << tempVisible;
tempLocation = static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,widget, view)).toInt());
tempLocation = static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,widget, view), QVariant(Qt::RightDockWidgetArea)).toInt());
if (widget == MainWindow::MENU_UAS_LIST)
{
if (!settings.contains(buildMenuKey (SUB_SECTION_LOCATION,widget, view)))
{
tempLocation = Qt::RightDockWidgetArea;
}
}
if (tempWidget && tempVisible)
if ((tempWidget != NULL) && tempVisible)
{
addDockWidget(tempLocation, tempWidget);
tempWidget->show();
......
......@@ -83,7 +83,7 @@ class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
static MainWindow* instance();
~MainWindow();
public slots:
......@@ -188,6 +188,8 @@ public slots:
protected:
MainWindow(QWidget *parent = 0);
// These defines are used to save the settings when selecting with
// which widgets populate the views
// FIXME: DO NOT PUT CUSTOM VALUES IN THIS ENUM since it is iterated over
......
#include "QGCUnconnectedInfoWidget.h"
#include "ui_QGCUnconnectedInfoWidget.h"
QGCUnconnectedInfoWidget::QGCUnconnectedInfoWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::QGCUnconnectedInfoWidget)
{
ui->setupUi(this);
connect(ui->simulationButton, SIGNAL(clicked()), this, SIGNAL(simulation()));
connect(ui->connectButton, SIGNAL(clicked()), this, SIGNAL(addLink()));
}
QGCUnconnectedInfoWidget::~QGCUnconnectedInfoWidget()
{
delete ui;
}
#ifndef QGCUNCONNECTEDINFOWIDGET_H
#define QGCUNCONNECTEDINFOWIDGET_H
#include <QWidget>
namespace Ui {
class QGCUnconnectedInfoWidget;
}
class QGCUnconnectedInfoWidget : public QWidget
{
Q_OBJECT
public:
explicit QGCUnconnectedInfoWidget(QWidget *parent = 0);
~QGCUnconnectedInfoWidget();
Ui::QGCUnconnectedInfoWidget *ui;
signals:
void simulation();
void addLink();
};
#endif // QGCUNCONNECTEDINFOWIDGET_H
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QGCUnconnectedInfoWidget</class>
<widget class="QWidget" name="QGCUnconnectedInfoWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="3">
<widget class="QTextEdit" name="textEdit">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="autoFormatting">
<set>QTextEdit::AutoAll</set>
</property>
<property name="undoRedoEnabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;table border=&quot;0&quot; style=&quot;-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;border: none;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:14pt; font-weight:600;&quot;&gt;Unmanned System List&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:6pt; font-weight:600;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt; font-weight:600;&quot;&gt;No Systems are connected yet.&lt;/span&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; Please either connect a link or use the simulation function to see QGroundControl in action.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt; font-style:italic;&quot;&gt;Click on the simulation button below to simulate a micro air vehicle or on the connect link button to connect a serial port link. A UDP link is already open for connections.&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="1" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="simulationButton">
<property name="text">
<string>Simulate MAV</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="connectButton">
<property name="text">
<string>Connect Link</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
......@@ -33,12 +33,17 @@ This file is part of the PIXHAWK project
#include <QLabel>
#include <QFileDialog>
#include <QDebug>
#include <QApplication>
#include "MG.h"
#include "UASListWidget.h"
#include "UASManager.h"
#include "UAS.h"
#include "UASView.h"
#include "QGCUnconnectedInfoWidget.h"
#include "MainWindow.h"
#include "MAVLinkSimulationLink.h"
#include "LinkManager.h"
UASListWidget::UASListWidget(QWidget *parent) : QWidget(parent), m_ui(new Ui::UASList)
{
......@@ -48,6 +53,13 @@ UASListWidget::UASListWidget(QWidget *parent) : QWidget(parent), m_ui(new Ui::UA
listLayout->setAlignment(Qt::AlignTop);
this->setLayout(listLayout);
// Construct initial widget
uWidget = new QGCUnconnectedInfoWidget(this);
listLayout->addWidget(uWidget);
connect(uWidget, SIGNAL(addLink()), this, SLOT(addLink()));
connect(uWidget, SIGNAL(simulation()), this, SLOT(simulate()));
this->setMinimumWidth(250);
uasViews = QMap<UASInterface*, UASView*>();
......@@ -72,11 +84,32 @@ void UASListWidget::changeEvent(QEvent *e)
}
}
void UASListWidget::addLink()
{
MainWindow::instance()->addLink();
}
void UASListWidget::simulate()
{
// Try to get reference to MAVLinkSimulationlink
QList<LinkInterface*> links = LinkManager::instance()->getLinks();
foreach(LinkInterface* link, links)
{
MAVLinkSimulationLink* sim = dynamic_cast<MAVLinkSimulationLink*>(link);
if (sim)
{
sim->connectLink();
}
}
}
void UASListWidget::addUAS(UASInterface* uas)
{
if (uasViews.size() == 0)
if (uasViews.isEmpty())
{
// TODO Add label when no UAS is present yet.
listLayout->removeWidget(uWidget);
delete uWidget;
uWidget = NULL;
}
if (!uasViews.contains(uas))
......
......@@ -36,6 +36,7 @@ This file is part of the QGROUNDCONTROL project
#include <QVBoxLayout>
#include "UASInterface.h"
#include "UASView.h"
#include "QGCUnconnectedInfoWidget.h"
#include "ui_UASList.h"
class UASListWidget : public QWidget
......@@ -51,9 +52,14 @@ public slots:
void activeUAS(UASInterface* uas);
void removeUAS(UASInterface* uas);
// TODO Kind of hack, works flawless but is bad architecture
void addLink();
void simulate();
protected:
QMap<UASInterface*, UASView*> uasViews;
QVBoxLayout* listLayout;
QGCUnconnectedInfoWidget* uWidget;
void changeEvent(QEvent *e);
private:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment