diff options
53 files changed, 5979 insertions, 940 deletions
diff --git a/.qmake.conf b/.qmake.conf index 7e0ad0e1..dc68d388 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,3 @@ load(qt_build_config) -MODULE_VERSION = 5.9.5 +MODULE_VERSION = 5.11.0 diff --git a/dist/changes-5.10.0 b/dist/changes-5.10.0 new file mode 100644 index 00000000..c92d3787 --- /dev/null +++ b/dist/changes-5.10.0 @@ -0,0 +1,28 @@ +Qt 5.10 introduces many new features and improvements as well as bugfixes +over the 5.9.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.10 series is binary compatible with the 5.9.x series. +Applications compiled for 5.9 will continue to run with 5.10. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.10.0 Changes * +**************************************************************************** + + - [QTBUG-60652] Updated the examples according to good coding practices + and current conventions. + + - QSerialPort: + * Increased the internal buffer chunk size to improve performance. + * Fixed build on Android with the API level more than 21. + * Improved read performance when the buffer size is limited. diff --git a/dist/changes-5.10.1 b/dist/changes-5.10.1 new file mode 100644 index 00000000..695c4e36 --- /dev/null +++ b/dist/changes-5.10.1 @@ -0,0 +1,26 @@ +Qt 5.10.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.10.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.10 series is binary compatible with the 5.9.x series. +Applications compiled for 5.9 will continue to run with 5.10. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +This release contains all fixes included in the Qt 5.9.4 release. + +**************************************************************************** +* Qt 5.10.1 Changes * +**************************************************************************** + + - This release contains only minor code improvements. diff --git a/examples/serialport/blockingmaster/blockingmaster.pro b/examples/serialport/blockingmaster/blockingmaster.pro index 7cf76d8b..8e3356bc 100644 --- a/examples/serialport/blockingmaster/blockingmaster.pro +++ b/examples/serialport/blockingmaster/blockingmaster.pro @@ -1,4 +1,5 @@ QT += widgets serialport +requires(qtConfig(combobox)) TARGET = blockingmaster TEMPLATE = app diff --git a/examples/serialport/blockingmaster/dialog.cpp b/examples/serialport/blockingmaster/dialog.cpp index 08403c36..2617da79 100644 --- a/examples/serialport/blockingmaster/dialog.cpp +++ b/examples/serialport/blockingmaster/dialog.cpp @@ -50,95 +50,93 @@ #include "dialog.h" +#include <QComboBox> +#include <QGridLayout> #include <QLabel> #include <QLineEdit> -#include <QComboBox> -#include <QSpinBox> #include <QPushButton> -#include <QGridLayout> - -#include <QtSerialPort/QSerialPortInfo> - -QT_USE_NAMESPACE +#include <QSerialPortInfo> +#include <QSpinBox> -Dialog::Dialog(QWidget *parent) - : QDialog(parent) - , transactionCount(0) - , serialPortLabel(new QLabel(tr("Serial port:"))) - , serialPortComboBox(new QComboBox()) - , waitResponseLabel(new QLabel(tr("Wait response, msec:"))) - , waitResponseSpinBox(new QSpinBox()) - , requestLabel(new QLabel(tr("Request:"))) - , requestLineEdit(new QLineEdit(tr("Who are you?"))) - , trafficLabel(new QLabel(tr("No traffic."))) - , statusLabel(new QLabel(tr("Status: Not running."))) - , runButton(new QPushButton(tr("Start"))) +Dialog::Dialog(QWidget *parent) : + QDialog(parent), + m_serialPortLabel(new QLabel(tr("Serial port:"))), + m_serialPortComboBox(new QComboBox), + m_waitResponseLabel(new QLabel(tr("Wait response, msec:"))), + m_waitResponseSpinBox(new QSpinBox), + m_requestLabel(new QLabel(tr("Request:"))), + m_requestLineEdit(new QLineEdit(tr("Who are you?"))), + m_trafficLabel(new QLabel(tr("No traffic."))), + m_statusLabel(new QLabel(tr("Status: Not running."))), + m_runButton(new QPushButton(tr("Start"))) { const auto infos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &info : infos) - serialPortComboBox->addItem(info.portName()); + m_serialPortComboBox->addItem(info.portName()); - waitResponseSpinBox->setRange(0, 10000); - waitResponseSpinBox->setValue(1000); + m_waitResponseSpinBox->setRange(0, 10000); + m_waitResponseSpinBox->setValue(1000); auto mainLayout = new QGridLayout; - mainLayout->addWidget(serialPortLabel, 0, 0); - mainLayout->addWidget(serialPortComboBox, 0, 1); - mainLayout->addWidget(waitResponseLabel, 1, 0); - mainLayout->addWidget(waitResponseSpinBox, 1, 1); - mainLayout->addWidget(runButton, 0, 2, 2, 1); - mainLayout->addWidget(requestLabel, 2, 0); - mainLayout->addWidget(requestLineEdit, 2, 1, 1, 3); - mainLayout->addWidget(trafficLabel, 3, 0, 1, 4); - mainLayout->addWidget(statusLabel, 4, 0, 1, 5); + mainLayout->addWidget(m_serialPortLabel, 0, 0); + mainLayout->addWidget(m_serialPortComboBox, 0, 1); + mainLayout->addWidget(m_waitResponseLabel, 1, 0); + mainLayout->addWidget(m_waitResponseSpinBox, 1, 1); + mainLayout->addWidget(m_runButton, 0, 2, 2, 1); + mainLayout->addWidget(m_requestLabel, 2, 0); + mainLayout->addWidget(m_requestLineEdit, 2, 1, 1, 3); + mainLayout->addWidget(m_trafficLabel, 3, 0, 1, 4); + mainLayout->addWidget(m_statusLabel, 4, 0, 1, 5); setLayout(mainLayout); setWindowTitle(tr("Blocking Master")); - serialPortComboBox->setFocus(); + m_serialPortComboBox->setFocus(); - connect(runButton, &QPushButton::clicked, this, &Dialog::transaction); - connect(&thread, &MasterThread::response, this, &Dialog::showResponse); - connect(&thread, &MasterThread::error, this, &Dialog::processError); - connect(&thread, &MasterThread::timeout, this, &Dialog::processTimeout); + connect(m_runButton, &QPushButton::clicked, this, &Dialog::transaction); + connect(&m_thread, &MasterThread::response, this, &Dialog::showResponse); + connect(&m_thread, &MasterThread::error, this, &Dialog::processError); + connect(&m_thread, &MasterThread::timeout, this, &Dialog::processTimeout); } void Dialog::transaction() { setControlsEnabled(false); - statusLabel->setText(tr("Status: Running, connected to port %1.") - .arg(serialPortComboBox->currentText())); - thread.transaction(serialPortComboBox->currentText(), - waitResponseSpinBox->value(), - requestLineEdit->text()); + m_statusLabel->setText(tr("Status: Running, connected to port %1.") + .arg(m_serialPortComboBox->currentText())); + m_thread.transaction(m_serialPortComboBox->currentText(), + m_waitResponseSpinBox->value(), + m_requestLineEdit->text()); } void Dialog::showResponse(const QString &s) { setControlsEnabled(true); - trafficLabel->setText(tr("Traffic, transaction #%1:" - "\n\r-request: %2" - "\n\r-response: %3") - .arg(++transactionCount).arg(requestLineEdit->text()).arg(s)); + m_trafficLabel->setText(tr("Traffic, transaction #%1:" + "\n\r-request: %2" + "\n\r-response: %3") + .arg(++m_transactionCount) + .arg(m_requestLineEdit->text()) + .arg(s)); } void Dialog::processError(const QString &s) { setControlsEnabled(true); - statusLabel->setText(tr("Status: Not running, %1.").arg(s)); - trafficLabel->setText(tr("No traffic.")); + m_statusLabel->setText(tr("Status: Not running, %1.").arg(s)); + m_trafficLabel->setText(tr("No traffic.")); } void Dialog::processTimeout(const QString &s) { setControlsEnabled(true); - statusLabel->setText(tr("Status: Running, %1.").arg(s)); - trafficLabel->setText(tr("No traffic.")); + m_statusLabel->setText(tr("Status: Running, %1.").arg(s)); + m_trafficLabel->setText(tr("No traffic.")); } void Dialog::setControlsEnabled(bool enable) { - runButton->setEnabled(enable); - serialPortComboBox->setEnabled(enable); - waitResponseSpinBox->setEnabled(enable); - requestLineEdit->setEnabled(enable); + m_runButton->setEnabled(enable); + m_serialPortComboBox->setEnabled(enable); + m_waitResponseSpinBox->setEnabled(enable); + m_requestLineEdit->setEnabled(enable); } diff --git a/examples/serialport/blockingmaster/dialog.h b/examples/serialport/blockingmaster/dialog.h index aff8177a..8d997fa1 100644 --- a/examples/serialport/blockingmaster/dialog.h +++ b/examples/serialport/blockingmaster/dialog.h @@ -51,10 +51,10 @@ #ifndef DIALOG_H #define DIALOG_H -#include <QDialog> - #include "masterthread.h" +#include <QDialog> + QT_BEGIN_NAMESPACE class QLabel; @@ -82,18 +82,18 @@ private: void setControlsEnabled(bool enable); private: - int transactionCount; - QLabel *serialPortLabel; - QComboBox *serialPortComboBox; - QLabel *waitResponseLabel; - QSpinBox *waitResponseSpinBox; - QLabel *requestLabel; - QLineEdit *requestLineEdit; - QLabel *trafficLabel; - QLabel *statusLabel; - QPushButton *runButton; + int m_transactionCount = 0; + QLabel *m_serialPortLabel = nullptr; + QComboBox *m_serialPortComboBox = nullptr; + QLabel *m_waitResponseLabel = nullptr; + QSpinBox *m_waitResponseSpinBox = nullptr; + QLabel *m_requestLabel = nullptr; + QLineEdit *m_requestLineEdit = nullptr; + QLabel *m_trafficLabel = nullptr; + QLabel *m_statusLabel = nullptr; + QPushButton *m_runButton = nullptr; - MasterThread thread; + MasterThread m_thread; }; #endif // DIALOG_H diff --git a/examples/serialport/blockingmaster/main.cpp b/examples/serialport/blockingmaster/main.cpp index cf4c4211..8e68c730 100644 --- a/examples/serialport/blockingmaster/main.cpp +++ b/examples/serialport/blockingmaster/main.cpp @@ -48,10 +48,10 @@ ** ****************************************************************************/ -#include <QApplication> - #include "dialog.h" +#include <QApplication> + int main(int argc, char *argv[]) { QApplication app(argc, argv); diff --git a/examples/serialport/blockingmaster/masterthread.cpp b/examples/serialport/blockingmaster/masterthread.cpp index 5ad93fd3..25aa8489 100644 --- a/examples/serialport/blockingmaster/masterthread.cpp +++ b/examples/serialport/blockingmaster/masterthread.cpp @@ -50,24 +50,21 @@ #include "masterthread.h" -#include <QtSerialPort/QSerialPort> - +#include <QSerialPort> #include <QTime> -QT_USE_NAMESPACE - -MasterThread::MasterThread(QObject *parent) - : QThread(parent), waitTimeout(0), quit(false) +MasterThread::MasterThread(QObject *parent) : + QThread(parent) { } //! [0] MasterThread::~MasterThread() { - mutex.lock(); - quit = true; - cond.wakeOne(); - mutex.unlock(); + m_mutex.lock(); + m_quit = true; + m_cond.wakeOne(); + m_mutex.unlock(); wait(); } //! [0] @@ -75,16 +72,16 @@ MasterThread::~MasterThread() //! [1] //! [2] void MasterThread::transaction(const QString &portName, int waitTimeout, const QString &request) { - //! [1] - QMutexLocker locker(&mutex); - this->portName = portName; - this->waitTimeout = waitTimeout; - this->request = request; - //! [3] +//! [1] + const QMutexLocker locker(&m_mutex); + m_portName = portName; + m_waitTimeout = waitTimeout; + m_request = request; +//! [3] if (!isRunning()) start(); else - cond.wakeOne(); + m_cond.wakeOne(); } //! [2] //! [3] @@ -93,18 +90,18 @@ void MasterThread::run() { bool currentPortNameChanged = false; - mutex.lock(); - //! [4] //! [5] + m_mutex.lock(); +//! [4] //! [5] QString currentPortName; - if (currentPortName != portName) { - currentPortName = portName; + if (currentPortName != m_portName) { + currentPortName = m_portName; currentPortNameChanged = true; } - int currentWaitTimeout = waitTimeout; - QString currentRequest = request; - mutex.unlock(); - //! [5] //! [6] + int currentWaitTimeout = m_waitTimeout; + QString currentRequest = m_request; + m_mutex.unlock(); +//! [5] //! [6] QSerialPort serial; if (currentPortName.isEmpty()) { @@ -112,55 +109,55 @@ void MasterThread::run() return; } - while (!quit) { - //![6] //! [7] + while (!m_quit) { +//![6] //! [7] if (currentPortNameChanged) { serial.close(); serial.setPortName(currentPortName); if (!serial.open(QIODevice::ReadWrite)) { emit error(tr("Can't open %1, error code %2") - .arg(portName).arg(serial.error())); + .arg(m_portName).arg(serial.error())); return; } } - //! [7] //! [8] +//! [7] //! [8] // write request - QByteArray requestData = currentRequest.toLocal8Bit(); + const QByteArray requestData = currentRequest.toUtf8(); serial.write(requestData); - if (serial.waitForBytesWritten(waitTimeout)) { - //! [8] //! [10] + if (serial.waitForBytesWritten(m_waitTimeout)) { +//! [8] //! [10] // read response if (serial.waitForReadyRead(currentWaitTimeout)) { QByteArray responseData = serial.readAll(); while (serial.waitForReadyRead(10)) responseData += serial.readAll(); - QString response(responseData); - //! [12] + const QString response = QString::fromUtf8(responseData); +//! [12] emit this->response(response); - //! [10] //! [11] //! [12] +//! [10] //! [11] //! [12] } else { emit timeout(tr("Wait read response timeout %1") .arg(QTime::currentTime().toString())); } - //! [9] //! [11] +//! [9] //! [11] } else { emit timeout(tr("Wait write request timeout %1") .arg(QTime::currentTime().toString())); } - //! [9] //! [13] - mutex.lock(); - cond.wait(&mutex); - if (currentPortName != portName) { - currentPortName = portName; +//! [9] //! [13] + m_mutex.lock(); + m_cond.wait(&m_mutex); + if (currentPortName != m_portName) { + currentPortName = m_portName; currentPortNameChanged = true; } else { currentPortNameChanged = false; } - currentWaitTimeout = waitTimeout; - currentRequest = request; - mutex.unlock(); + currentWaitTimeout = m_waitTimeout; + currentRequest = m_request; + m_mutex.unlock(); } - //! [13] +//! [13] } diff --git a/examples/serialport/blockingmaster/masterthread.h b/examples/serialport/blockingmaster/masterthread.h index f23559fd..9dc6048c 100644 --- a/examples/serialport/blockingmaster/masterthread.h +++ b/examples/serialport/blockingmaster/masterthread.h @@ -51,8 +51,8 @@ #ifndef MASTERTHREAD_H #define MASTERTHREAD_H -#include <QThread> #include <QMutex> +#include <QThread> #include <QWaitCondition> //! [0] @@ -65,7 +65,6 @@ public: ~MasterThread(); void transaction(const QString &portName, int waitTimeout, const QString &request); - void run() Q_DECL_OVERRIDE; signals: void response(const QString &s); @@ -73,12 +72,14 @@ signals: void timeout(const QString &s); private: - QString portName; - QString request; - int waitTimeout; - QMutex mutex; - QWaitCondition cond; - bool quit; + void run() override; + + QString m_portName; + QString m_request; + int m_waitTimeout = 0; + QMutex m_mutex; + QWaitCondition m_cond; + bool m_quit = false; }; //! [0] diff --git a/examples/serialport/blockingslave/blockingslave.pro b/examples/serialport/blockingslave/blockingslave.pro index 11b9b80b..4e2a25d2 100644 --- a/examples/serialport/blockingslave/blockingslave.pro +++ b/examples/serialport/blockingslave/blockingslave.pro @@ -1,4 +1,5 @@ QT += widgets serialport +requires(qtConfig(combobox)) TARGET = blockingslave TEMPLATE = app diff --git a/examples/serialport/blockingslave/dialog.cpp b/examples/serialport/blockingslave/dialog.cpp index 3bfd4194..1723086c 100644 --- a/examples/serialport/blockingslave/dialog.cpp +++ b/examples/serialport/blockingslave/dialog.cpp @@ -50,95 +50,94 @@ #include "dialog.h" +#include <QComboBox> +#include <QGridLayout> #include <QLabel> #include <QLineEdit> -#include <QComboBox> -#include <QSpinBox> #include <QPushButton> -#include <QGridLayout> - -#include <QtSerialPort/QSerialPortInfo> - -QT_USE_NAMESPACE +#include <QSerialPortInfo> +#include <QSpinBox> -Dialog::Dialog(QWidget *parent) - : QDialog(parent) - , transactionCount(0) - , serialPortLabel(new QLabel(tr("Serial port:"))) - , serialPortComboBox(new QComboBox()) - , waitRequestLabel(new QLabel(tr("Wait request, msec:"))) - , waitRequestSpinBox(new QSpinBox()) - , responseLabel(new QLabel(tr("Response:"))) - , responseLineEdit(new QLineEdit(tr("Hello, I'm Slave."))) - , trafficLabel(new QLabel(tr("No traffic."))) - , statusLabel(new QLabel(tr("Status: Not running."))) - , runButton(new QPushButton(tr("Start"))) +Dialog::Dialog(QWidget *parent) : + QDialog(parent), + m_serialPortLabel(new QLabel(tr("Serial port:"))), + m_serialPortComboBox(new QComboBox), + m_waitRequestLabel(new QLabel(tr("Wait request, msec:"))), + m_waitRequestSpinBox(new QSpinBox), + m_responseLabel(new QLabel(tr("Response:"))), + m_responseLineEdit(new QLineEdit(tr("Hello, I'm Slave."))), + m_trafficLabel(new QLabel(tr("No traffic."))), + m_statusLabel(new QLabel(tr("Status: Not running."))), + m_runButton(new QPushButton(tr("Start"))) { - waitRequestSpinBox->setRange(0, 10000); - waitRequestSpinBox->setValue(10000); + m_waitRequestSpinBox->setRange(0, 10000); + m_waitRequestSpinBox->setValue(10000); const auto infos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &info : infos) - serialPortComboBox->addItem(info.portName()); + m_serialPortComboBox->addItem(info.portName()); auto mainLayout = new QGridLayout; - mainLayout->addWidget(serialPortLabel, 0, 0); - mainLayout->addWidget(serialPortComboBox, 0, 1); - mainLayout->addWidget(waitRequestLabel, 1, 0); - mainLayout->addWidget(waitRequestSpinBox, 1, 1); - mainLayout->addWidget(runButton, 0, 2, 2, 1); - mainLayout->addWidget(responseLabel, 2, 0); - mainLayout->addWidget(responseLineEdit, 2, 1, 1, 3); - mainLayout->addWidget(trafficLabel, 3, 0, 1, 4); - mainLayout->addWidget(statusLabel, 4, 0, 1, 5); + mainLayout->addWidget(m_serialPortLabel, 0, 0); + mainLayout->addWidget(m_serialPortComboBox, 0, 1); + mainLayout->addWidget(m_waitRequestLabel, 1, 0); + mainLayout->addWidget(m_waitRequestSpinBox, 1, 1); + mainLayout->addWidget(m_runButton, 0, 2, 2, 1); + mainLayout->addWidget(m_responseLabel, 2, 0); + mainLayout->addWidget(m_responseLineEdit, 2, 1, 1, 3); + mainLayout->addWidget(m_trafficLabel, 3, 0, 1, 4); + mainLayout->addWidget(m_statusLabel, 4, 0, 1, 5); setLayout(mainLayout); setWindowTitle(tr("Blocking Slave")); - serialPortComboBox->setFocus(); + m_serialPortComboBox->setFocus(); - connect(runButton, &QPushButton::clicked, this, &Dialog::startSlave); - connect(&thread, &SlaveThread::request, this,&Dialog::showRequest); - connect(&thread, &SlaveThread::error, this, &Dialog::processError); - connect(&thread, &SlaveThread::timeout, this, &Dialog::processTimeout); + connect(m_runButton, &QPushButton::clicked, this, &Dialog::startSlave); + connect(&m_thread, &SlaveThread::request, this,&Dialog::showRequest); + connect(&m_thread, &SlaveThread::error, this, &Dialog::processError); + connect(&m_thread, &SlaveThread::timeout, this, &Dialog::processTimeout); - connect(serialPortComboBox, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged), + connect(m_serialPortComboBox, QOverload<const QString &>::of(&QComboBox::currentIndexChanged), this, &Dialog::activateRunButton); - connect(waitRequestSpinBox, static_cast<void (QSpinBox::*)(const QString &)>(&QSpinBox::valueChanged), + connect(m_waitRequestSpinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged), this, &Dialog::activateRunButton); - connect(responseLineEdit, &QLineEdit::textChanged, this, &Dialog::activateRunButton); + connect(m_responseLineEdit, &QLineEdit::textChanged, this, &Dialog::activateRunButton); } void Dialog::startSlave() { - runButton->setEnabled(false); - statusLabel->setText(tr("Status: Running, connected to port %1.") - .arg(serialPortComboBox->currentText())); - thread.startSlave(serialPortComboBox->currentText(), - waitRequestSpinBox->value(), - responseLineEdit->text()); + m_runButton->setEnabled(false); + m_statusLabel->setText(tr("Status: Running, connected to port %1.") + .arg(m_serialPortComboBox->currentText())); + m_thread.startSlave(m_serialPortComboBox->currentText(), + m_waitRequestSpinBox->value(), + m_responseLineEdit->text()); } void Dialog::showRequest(const QString &s) { - trafficLabel->setText(tr("Traffic, transaction #%1:" - "\n\r-request: %2" - "\n\r-response: %3") - .arg(++transactionCount).arg(s).arg(responseLineEdit->text())); + m_trafficLabel->setText(tr("Traffic, transaction #%1:" + "\n\r-request: %2" + "\n\r-response: %3") + .arg(++m_transactionCount) + .arg(s) + .arg(m_responseLineEdit->text())); } void Dialog::processError(const QString &s) { activateRunButton(); - statusLabel->setText(tr("Status: Not running, %1.").arg(s)); - trafficLabel->setText(tr("No traffic.")); + m_statusLabel->setText(tr("Status: Not running, %1.").arg(s)); + m_trafficLabel->setText(tr("No traffic.")); } void Dialog::processTimeout(const QString &s) { - statusLabel->setText(tr("Status: Running, %1.").arg(s)); - trafficLabel->setText(tr("No traffic.")); + m_statusLabel->setText(tr("Status: Running, %1.").arg(s)); + m_trafficLabel->setText(tr("No traffic.")); } + void Dialog::activateRunButton() { - runButton->setEnabled(true); + m_runButton->setEnabled(true); } diff --git a/examples/serialport/blockingslave/dialog.h b/examples/serialport/blockingslave/dialog.h index 0e594102..c8f80a62 100644 --- a/examples/serialport/blockingslave/dialog.h +++ b/examples/serialport/blockingslave/dialog.h @@ -51,10 +51,10 @@ #ifndef DIALOG_H #define DIALOG_H -#include <QDialog> - #include "slavethread.h" +#include <QDialog> + QT_BEGIN_NAMESPACE class QLabel; @@ -80,18 +80,18 @@ private slots: void activateRunButton(); private: - int transactionCount; - QLabel *serialPortLabel; - QComboBox *serialPortComboBox; - QLabel *waitRequestLabel; - QSpinBox *waitRequestSpinBox; - QLabel *responseLabel; - QLineEdit *responseLineEdit; - QLabel *trafficLabel; - QLabel *statusLabel; - QPushButton *runButton; + int m_transactionCount = 0; + QLabel *m_serialPortLabel = nullptr; + QComboBox *m_serialPortComboBox = nullptr; + QLabel *m_waitRequestLabel = nullptr; + QSpinBox *m_waitRequestSpinBox = nullptr; + QLabel *m_responseLabel = nullptr; + QLineEdit *m_responseLineEdit = nullptr; + QLabel *m_trafficLabel = nullptr; + QLabel *m_statusLabel = nullptr; + QPushButton *m_runButton = nullptr; - SlaveThread thread; + SlaveThread m_thread; }; #endif // DIALOG_H diff --git a/examples/serialport/blockingslave/main.cpp b/examples/serialport/blockingslave/main.cpp index cf4c4211..8e68c730 100644 --- a/examples/serialport/blockingslave/main.cpp +++ b/examples/serialport/blockingslave/main.cpp @@ -48,10 +48,10 @@ ** ****************************************************************************/ -#include <QApplication> - #include "dialog.h" +#include <QApplication> + int main(int argc, char *argv[]) { QApplication app(argc, argv); diff --git a/examples/serialport/blockingslave/slavethread.cpp b/examples/serialport/blockingslave/slavethread.cpp index 66bfb199..85b010a6 100644 --- a/examples/serialport/blockingslave/slavethread.cpp +++ b/examples/serialport/blockingslave/slavethread.cpp @@ -50,22 +50,20 @@ #include "slavethread.h" -#include <QtSerialPort/QSerialPort> - +#include <QSerialPort> #include <QTime> -QT_USE_NAMESPACE - -SlaveThread::SlaveThread(QObject *parent) - : QThread(parent), waitTimeout(0), quit(false) +SlaveThread::SlaveThread(QObject *parent) : + QThread(parent) { } + //! [0] SlaveThread::~SlaveThread() { - mutex.lock(); - quit = true; - mutex.unlock(); + m_mutex.lock(); + m_quit = true; + m_mutex.unlock(); wait(); } //! [0] @@ -73,12 +71,12 @@ SlaveThread::~SlaveThread() //! [1] //! [2] void SlaveThread::startSlave(const QString &portName, int waitTimeout, const QString &response) { -//! [1] - QMutexLocker locker(&mutex); - this->portName = portName; - this->waitTimeout = waitTimeout; - this->response = response; -//! [3] + //! [1] + const QMutexLocker locker(&m_mutex); + m_portName = portName; + m_waitTimeout = waitTimeout; + m_response = response; + //! [3] if (!isRunning()) start(); } @@ -89,21 +87,21 @@ void SlaveThread::run() { bool currentPortNameChanged = false; - mutex.lock(); + m_mutex.lock(); //! [4] //! [5] QString currentPortName; - if (currentPortName != portName) { - currentPortName = portName; + if (currentPortName != m_portName) { + currentPortName = m_portName; currentPortNameChanged = true; } - int currentWaitTimeout = waitTimeout; - QString currentRespone = response; - mutex.unlock(); + int currentWaitTimeout = m_waitTimeout; + QString currentRespone = m_response; + m_mutex.unlock(); //! [5] //! [6] QSerialPort serial; - while (!quit) { + while (!m_quit) { //![6] //! [7] if (currentPortNameChanged) { serial.close(); @@ -111,7 +109,7 @@ void SlaveThread::run() if (!serial.open(QIODevice::ReadWrite)) { emit error(tr("Can't open %1, error code %2") - .arg(portName).arg(serial.error())); + .arg(m_portName).arg(serial.error())); return; } } @@ -124,10 +122,10 @@ void SlaveThread::run() requestData += serial.readAll(); //! [8] //! [10] // write response - QByteArray responseData = currentRespone.toLocal8Bit(); + const QByteArray responseData = currentRespone.toUtf8(); serial.write(responseData); - if (serial.waitForBytesWritten(waitTimeout)) { - QString request(requestData); + if (serial.waitForBytesWritten(m_waitTimeout)) { + const QString request = QString::fromUtf8(requestData); //! [12] emit this->request(request); //! [10] //! [11] //! [12] @@ -141,16 +139,16 @@ void SlaveThread::run() .arg(QTime::currentTime().toString())); } //! [9] //! [13] - mutex.lock(); - if (currentPortName != portName) { - currentPortName = portName; + m_mutex.lock(); + if (currentPortName != m_portName) { + currentPortName = m_portName; currentPortNameChanged = true; } else { currentPortNameChanged = false; } - currentWaitTimeout = waitTimeout; - currentRespone = response; - mutex.unlock(); + currentWaitTimeout = m_waitTimeout; + currentRespone = m_response; + m_mutex.unlock(); } //! [13] } diff --git a/examples/serialport/blockingslave/slavethread.h b/examples/serialport/blockingslave/slavethread.h index 9a15e243..737e7cb1 100644 --- a/examples/serialport/blockingslave/slavethread.h +++ b/examples/serialport/blockingslave/slavethread.h @@ -51,8 +51,8 @@ #ifndef SLAVETHREAD_H #define SLAVETHREAD_H -#include <QThread> #include <QMutex> +#include <QThread> #include <QWaitCondition> //! [0] @@ -65,7 +65,6 @@ public: ~SlaveThread(); void startSlave(const QString &portName, int waitTimeout, const QString &response); - void run() Q_DECL_OVERRIDE; signals: void request(const QString &s); @@ -73,11 +72,13 @@ signals: void timeout(const QString &s); private: - QString portName; - QString response; - int waitTimeout; - QMutex mutex; - bool quit; + void run() override; + + QString m_portName; + QString m_response; + int m_waitTimeout = 0; + QMutex m_mutex; + bool m_quit = false; }; //! [0] diff --git a/examples/serialport/cenumerator/main.cpp b/examples/serialport/cenumerator/main.cpp index f8050219..af6d7e41 100644 --- a/examples/serialport/cenumerator/main.cpp +++ b/examples/serialport/cenumerator/main.cpp @@ -48,21 +48,19 @@ ** ****************************************************************************/ -#include <QTextStream> #include <QCoreApplication> -#include <QtSerialPort/QSerialPortInfo> - -QT_USE_NAMESPACE +#include <QSerialPortInfo> +#include <QTextStream> int main(int argc, char *argv[]) { - QCoreApplication a(argc, argv); + QCoreApplication coreApplication(argc, argv); QTextStream out(stdout); const auto serialPortInfos = QSerialPortInfo::availablePorts(); - out << QObject::tr("Total number of ports available: ") << serialPortInfos.count() << endl; + out << "Total number of ports available: " << serialPortInfos.count() << endl; - const QString blankString = QObject::tr("N/A"); + const QString blankString = "N/A"; QString description; QString manufacturer; QString serialNumber; @@ -72,14 +70,18 @@ int main(int argc, char *argv[]) manufacturer = serialPortInfo.manufacturer(); serialNumber = serialPortInfo.serialNumber(); out << endl - << QObject::tr("Port: ") << serialPortInfo.portName() << endl - << QObject::tr("Location: ") << serialPortInfo.systemLocation() << endl - << QObject::tr("Description: ") << (!description.isEmpty() ? description : blankString) << endl - << QObject::tr("Manufacturer: ") << (!manufacturer.isEmpty() ? manufacturer : blankString) << endl - << QObject::tr("Serial number: ") << (!serialNumber.isEmpty() ? serialNumber : blankString) << endl - << QObject::tr("Vendor Identifier: ") << (serialPortInfo.hasVendorIdentifier() ? QByteArray::number(serialPortInfo.vendorIdentifier(), 16) : blankString) << endl - << QObject::tr("Product Identifier: ") << (serialPortInfo.hasProductIdentifier() ? QByteArray::number(serialPortInfo.productIdentifier(), 16) : blankString) << endl - << QObject::tr("Busy: ") << (serialPortInfo.isBusy() ? QObject::tr("Yes") : QObject::tr("No")) << endl; + << "Port: " << serialPortInfo.portName() << endl + << "Location: " << serialPortInfo.systemLocation() << endl + << "Description: " << (!description.isEmpty() ? description : blankString) << endl + << "Manufacturer: " << (!manufacturer.isEmpty() ? manufacturer : blankString) << endl + << "Serial number: " << (!serialNumber.isEmpty() ? serialNumber : blankString) << endl + << "Vendor Identifier: " << (serialPortInfo.hasVendorIdentifier() + ? QByteArray::number(serialPortInfo.vendorIdentifier(), 16) + : blankString) << endl + << "Product Identifier: " << (serialPortInfo.hasProductIdentifier() + ? QByteArray::number(serialPortInfo.productIdentifier(), 16) + : blankString) << endl + << "Busy: " << (serialPortInfo.isBusy() ? "Yes" : "No") << endl; } return 0; diff --git a/examples/serialport/creaderasync/main.cpp b/examples/serialport/creaderasync/main.cpp index dd1f7559..6c669ceb 100644 --- a/examples/serialport/creaderasync/main.cpp +++ b/examples/serialport/creaderasync/main.cpp @@ -50,37 +50,39 @@ #include "serialportreader.h" -#include <QtSerialPort/QSerialPort> - -#include <QTextStream> #include <QCoreApplication> -#include <QFile> +#include <QSerialPort> #include <QStringList> - -QT_USE_NAMESPACE +#include <QTextStream> int main(int argc, char *argv[]) { QCoreApplication coreApplication(argc, argv); - int argumentCount = QCoreApplication::arguments().size(); - QStringList argumentList = QCoreApplication::arguments(); + const int argumentCount = QCoreApplication::arguments().size(); + const QStringList argumentList = QCoreApplication::arguments(); QTextStream standardOutput(stdout); if (argumentCount == 1) { - standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl; + standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]") + .arg(argumentList.first()) + << endl; return 1; } QSerialPort serialPort; - QString serialPortName = argumentList.at(1); + const QString serialPortName = argumentList.at(1); serialPort.setPortName(serialPortName); - int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600; + const int serialPortBaudRate = (argumentCount > 2) + ? argumentList.at(2).toInt() : QSerialPort::Baud9600; serialPort.setBaudRate(serialPortBaudRate); if (!serialPort.open(QIODevice::ReadOnly)) { - standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; + standardOutput << QObject::tr("Failed to open port %1, error: %2") + .arg(serialPortName) + .arg(serialPort.errorString()) + << endl; return 1; } diff --git a/examples/serialport/creaderasync/serialportreader.cpp b/examples/serialport/creaderasync/serialportreader.cpp index f85dd8a7..a701839b 100644 --- a/examples/serialport/creaderasync/serialportreader.cpp +++ b/examples/serialport/creaderasync/serialportreader.cpp @@ -52,25 +52,18 @@ #include <QCoreApplication> -QT_USE_NAMESPACE - -SerialPortReader::SerialPortReader(QSerialPort *serialPort, QObject *parent) - : QObject(parent) - , m_serialPort(serialPort) - , m_standardOutput(stdout) +SerialPortReader::SerialPortReader(QSerialPort *serialPort, QObject *parent) : + QObject(parent), + m_serialPort(serialPort), + m_standardOutput(stdout) { connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortReader::handleReadyRead); - connect(m_serialPort, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), - this, &SerialPortReader::handleError); + connect(m_serialPort, &QSerialPort::errorOccurred, this, &SerialPortReader::handleError); connect(&m_timer, &QTimer::timeout, this, &SerialPortReader::handleTimeout); m_timer.start(5000); } -SerialPortReader::~SerialPortReader() -{ -} - void SerialPortReader::handleReadyRead() { m_readData.append(m_serialPort->readAll()); @@ -82,9 +75,14 @@ void SerialPortReader::handleReadyRead() void SerialPortReader::handleTimeout() { if (m_readData.isEmpty()) { - m_standardOutput << QObject::tr("No data was currently available for reading from port %1").arg(m_serialPort->portName()) << endl; + m_standardOutput << QObject::tr("No data was currently available " + "for reading from port %1") + .arg(m_serialPort->portName()) + << endl; } else { - m_standardOutput << QObject::tr("Data successfully received from port %1").arg(m_serialPort->portName()) << endl; + m_standardOutput << QObject::tr("Data successfully received from port %1") + .arg(m_serialPort->portName()) + << endl; m_standardOutput << m_readData << endl; } @@ -94,7 +92,11 @@ void SerialPortReader::handleTimeout() void SerialPortReader::handleError(QSerialPort::SerialPortError serialPortError) { if (serialPortError == QSerialPort::ReadError) { - m_standardOutput << QObject::tr("An I/O error occurred while reading the data from port %1, error: %2").arg(m_serialPort->portName()).arg(m_serialPort->errorString()) << endl; + m_standardOutput << QObject::tr("An I/O error occurred while reading " + "the data from port %1, error: %2") + .arg(m_serialPort->portName()) + .arg(m_serialPort->errorString()) + << endl; QCoreApplication::exit(1); } } diff --git a/examples/serialport/creaderasync/serialportreader.h b/examples/serialport/creaderasync/serialportreader.h index 66980877..53074f14 100644 --- a/examples/serialport/creaderasync/serialportreader.h +++ b/examples/serialport/creaderasync/serialportreader.h @@ -51,14 +51,10 @@ #ifndef SERIALPORTREADER_H #define SERIALPORTREADER_H -#include <QtSerialPort/QSerialPort> - +#include <QByteArray> +#include <QSerialPort> #include <QTextStream> #include <QTimer> -#include <QByteArray> -#include <QObject> - -QT_USE_NAMESPACE QT_BEGIN_NAMESPACE @@ -70,7 +66,6 @@ class SerialPortReader : public QObject public: explicit SerialPortReader(QSerialPort *serialPort, QObject *parent = nullptr); - ~SerialPortReader(); private slots: void handleReadyRead(); @@ -78,10 +73,10 @@ private slots: void handleError(QSerialPort::SerialPortError error); private: - QSerialPort *m_serialPort; - QByteArray m_readData; + QSerialPort *m_serialPort = nullptr; + QByteArray m_readData; QTextStream m_standardOutput; - QTimer m_timer; + QTimer m_timer; }; -#endif +#endif // SERIALPORTREADER_H diff --git a/examples/serialport/creadersync/main.cpp b/examples/serialport/creadersync/main.cpp index c1bc08b6..845a5fb2 100644 --- a/examples/serialport/creadersync/main.cpp +++ b/examples/serialport/creadersync/main.cpp @@ -48,36 +48,36 @@ ** ****************************************************************************/ -#include <QtSerialPort/QSerialPort> - -#include <QTextStream> #include <QCoreApplication> +#include <QSerialPort> #include <QStringList> - -QT_USE_NAMESPACE +#include <QTextStream> int main(int argc, char *argv[]) { QCoreApplication coreApplication(argc, argv); - int argumentCount = QCoreApplication::arguments().size(); - QStringList argumentList = QCoreApplication::arguments(); + const int argumentCount = QCoreApplication::arguments().size(); + const QStringList argumentList = QCoreApplication::arguments(); QTextStream standardOutput(stdout); if (argumentCount == 1) { - standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl; + standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]") + .arg(argumentList.first()) << endl; return 1; } QSerialPort serialPort; - QString serialPortName = argumentList.at(1); + const QString serialPortName = argumentList.at(1); serialPort.setPortName(serialPortName); - int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600; + const int serialPortBaudRate = (argumentCount > 2) + ? argumentList.at(2).toInt() : QSerialPort::Baud9600; serialPort.setBaudRate(serialPortBaudRate); if (!serialPort.open(QIODevice::ReadOnly)) { - standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.error()) << endl; + standardOutput << QObject::tr("Failed to open port %1, error: %2") + .arg(serialPortName).arg(serialPort.error()) << endl; return 1; } @@ -86,14 +86,18 @@ int main(int argc, char *argv[]) readData.append(serialPort.readAll()); if (serialPort.error() == QSerialPort::ReadError) { - standardOutput << QObject::tr("Failed to read from port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; + standardOutput << QObject::tr("Failed to read from port %1, error: %2") + .arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } else if (serialPort.error() == QSerialPort::TimeoutError && readData.isEmpty()) { - standardOutput << QObject::tr("No data was currently available for reading from port %1").arg(serialPortName) << endl; + standardOutput << QObject::tr("No data was currently available" + " for reading from port %1") + .arg(serialPortName) << endl; return 0; } - standardOutput << QObject::tr("Data successfully received from port %1").arg(serialPortName) << endl; + standardOutput << QObject::tr("Data successfully received from port %1") + .arg(serialPortName) << endl; standardOutput << readData << endl; return 0; diff --git a/examples/serialport/cwriterasync/main.cpp b/examples/serialport/cwriterasync/main.cpp index 4ffb44bc..4d65e0a6 100644 --- a/examples/serialport/cwriterasync/main.cpp +++ b/examples/serialport/cwriterasync/main.cpp @@ -50,33 +50,32 @@ #include "serialportwriter.h" -#include <QtSerialPort/QSerialPort> - -#include <QTextStream> #include <QCoreApplication> #include <QFile> +#include <QSerialPort> #include <QStringList> - -QT_USE_NAMESPACE +#include <QTextStream> int main(int argc, char *argv[]) { QCoreApplication coreApplication(argc, argv); - int argumentCount = QCoreApplication::arguments().size(); - QStringList argumentList = QCoreApplication::arguments(); + const int argumentCount = QCoreApplication::arguments().size(); + const QStringList argumentList = QCoreApplication::arguments(); QTextStream standardOutput(stdout); if (argumentCount == 1) { - standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl; + standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]") + .arg(argumentList.first()) << endl; return 1; } QSerialPort serialPort; - QString serialPortName = argumentList.at(1); + const QString serialPortName = argumentList.at(1); serialPort.setPortName(serialPortName); - int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600; + const int serialPortBaudRate = (argumentCount > 2) + ? argumentList.at(2).toInt() : QSerialPort::Baud9600; serialPort.setBaudRate(serialPortBaudRate); serialPort.open(QIODevice::WriteOnly); @@ -87,11 +86,14 @@ int main(int argc, char *argv[]) return 1; } - QByteArray writeData(dataFile.readAll()); + const QByteArray writeData(dataFile.readAll()); dataFile.close(); if (writeData.isEmpty()) { - standardOutput << QObject::tr("Either no data was currently available on the standard input for reading, or an error occurred for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; + standardOutput << QObject::tr("Either no data was currently available on " + "the standard input for reading, " + "or an error occurred for port %1, error: %2") + .arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } diff --git a/examples/serialport/cwriterasync/serialportwriter.cpp b/examples/serialport/cwriterasync/serialportwriter.cpp index e940f3dd..c2916bb2 100644 --- a/examples/serialport/cwriterasync/serialportwriter.cpp +++ b/examples/serialport/cwriterasync/serialportwriter.cpp @@ -52,45 +52,47 @@ #include <QCoreApplication> -QT_USE_NAMESPACE - -SerialPortWriter::SerialPortWriter(QSerialPort *serialPort, QObject *parent) - : QObject(parent) - , m_serialPort(serialPort) - , m_standardOutput(stdout) - , m_bytesWritten(0) +SerialPortWriter::SerialPortWriter(QSerialPort *serialPort, QObject *parent) : + QObject(parent), + m_serialPort(serialPort), + m_standardOutput(stdout) { m_timer.setSingleShot(true); - connect(m_serialPort, &QSerialPort::bytesWritten, this, &SerialPortWriter::handleBytesWritten); - connect(m_serialPort, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), + connect(m_serialPort, &QSerialPort::bytesWritten, + this, &SerialPortWriter::handleBytesWritten); + connect(m_serialPort, &QSerialPort::errorOccurred, this, &SerialPortWriter::handleError); connect(&m_timer, &QTimer::timeout, this, &SerialPortWriter::handleTimeout); } -SerialPortWriter::~SerialPortWriter() -{ -} - void SerialPortWriter::handleBytesWritten(qint64 bytes) { m_bytesWritten += bytes; if (m_bytesWritten == m_writeData.size()) { m_bytesWritten = 0; - m_standardOutput << QObject::tr("Data successfully sent to port %1").arg(m_serialPort->portName()) << endl; + m_standardOutput << QObject::tr("Data successfully sent to port %1") + .arg(m_serialPort->portName()) << endl; QCoreApplication::quit(); } } void SerialPortWriter::handleTimeout() { - m_standardOutput << QObject::tr("Operation timed out for port %1, error: %2").arg(m_serialPort->portName()).arg(m_serialPort->errorString()) << endl; + m_standardOutput << QObject::tr("Operation timed out for port %1, error: %2") + .arg(m_serialPort->portName()) + .arg(m_serialPort->errorString()) + << endl; QCoreApplication::exit(1); } void SerialPortWriter::handleError(QSerialPort::SerialPortError serialPortError) { if (serialPortError == QSerialPort::WriteError) { - m_standardOutput << QObject::tr("An I/O error occurred while writing the data to port %1, error: %2").arg(m_serialPort->portName()).arg(m_serialPort->errorString()) << endl; + m_standardOutput << QObject::tr("An I/O error occurred while writing" + " the data to port %1, error: %2") + .arg(m_serialPort->portName()) + .arg(m_serialPort->errorString()) + << endl; QCoreApplication::exit(1); } } @@ -99,13 +101,19 @@ void SerialPortWriter::write(const QByteArray &writeData) { m_writeData = writeData; - qint64 bytesWritten = m_serialPort->write(writeData); + const qint64 bytesWritten = m_serialPort->write(writeData); if (bytesWritten == -1) { - m_standardOutput << QObject::tr("Failed to write the data to port %1, error: %2").arg(m_serialPort->portName()).arg(m_serialPort->errorString()) << endl; + m_standardOutput << QObject::tr("Failed to write the data to port %1, error: %2") + .arg(m_serialPort->portName()) + .arg(m_serialPort->errorString()) + << endl; QCoreApplication::exit(1); } else if (bytesWritten != m_writeData.size()) { - m_standardOutput << QObject::tr("Failed to write all the data to port %1, error: %2").arg(m_serialPort->portName()).arg(m_serialPort->errorString()) << endl; + m_standardOutput << QObject::tr("Failed to write all the data to port %1, error: %2") + .arg(m_serialPort->portName()) + .arg(m_serialPort->errorString()) + << endl; QCoreApplication::exit(1); } diff --git a/examples/serialport/cwriterasync/serialportwriter.h b/examples/serialport/cwriterasync/serialportwriter.h index 9fd305f1..1e94c0fb 100644 --- a/examples/serialport/cwriterasync/serialportwriter.h +++ b/examples/serialport/cwriterasync/serialportwriter.h @@ -51,14 +51,11 @@ #ifndef SERIALPORTWRITER_H #define SERIALPORTWRITER_H -#include <QtSerialPort/QSerialPort> - -#include <QTextStream> -#include <QTimer> #include <QByteArray> #include <QObject> - -QT_USE_NAMESPACE +#include <QSerialPort> +#include <QTextStream> +#include <QTimer> QT_BEGIN_NAMESPACE @@ -70,8 +67,6 @@ class SerialPortWriter : public QObject public: explicit SerialPortWriter(QSerialPort *serialPort, QObject *parent = nullptr); - ~SerialPortWriter(); - void write(const QByteArray &writeData); private slots: @@ -80,11 +75,11 @@ private slots: void handleError(QSerialPort::SerialPortError error); private: - QSerialPort *m_serialPort; - QByteArray m_writeData; - QTextStream m_standardOutput; - qint64 m_bytesWritten; - QTimer m_timer; + QSerialPort *m_serialPort = nullptr; + QByteArray m_writeData; + QTextStream m_standardOutput; + qint64 m_bytesWritten = 0; + QTimer m_timer; }; -#endif +#endif // SERIALPORTWRITER_H diff --git a/examples/serialport/cwritersync/main.cpp b/examples/serialport/cwritersync/main.cpp index a134ed9c..125c111c 100644 --- a/examples/serialport/cwritersync/main.cpp +++ b/examples/serialport/cwritersync/main.cpp @@ -48,43 +48,45 @@ ** ****************************************************************************/ -#include <QtSerialPort/QSerialPort> - -#include <QTextStream> #include <QCoreApplication> #include <QFile> +#include <QSerialPort> #include <QStringList> - -QT_USE_NAMESPACE +#include <QTextStream> int main(int argc, char *argv[]) { QCoreApplication coreApplication(argc, argv); - int argumentCount = QCoreApplication::arguments().size(); - QStringList argumentList = QCoreApplication::arguments(); + const int argumentCount = QCoreApplication::arguments().size(); + const QStringList argumentList = QCoreApplication::arguments(); QTextStream standardOutput(stdout); if (argumentCount == 1) { - standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl; + standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]") + .arg(argumentList.first()) << endl; return 1; } QSerialPort serialPort; - QString serialPortName = argumentList.at(1); + const QString serialPortName = argumentList.at(1); serialPort.setPortName(serialPortName); - int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600; + const int serialPortBaudRate = (argumentCount > 2) + ? argumentList.at(2).toInt() : QSerialPort::Baud9600; serialPort.setBaudRate(serialPortBaudRate); if (!serialPort.open(QIODevice::WriteOnly)) { - standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; + standardOutput << QObject::tr("Failed to open port %1, error: %2") + .arg(serialPortName).arg(serialPort.errorString()) + << endl; return 1; } QFile dataFile; if (!dataFile.open(stdin, QIODevice::ReadOnly)) { - standardOutput << QObject::tr("Failed to open stdin for reading") << endl; + standardOutput << QObject::tr("Failed to open stdin for reading") + << endl; return 1; } @@ -92,24 +94,32 @@ int main(int argc, char *argv[]) dataFile.close(); if (writeData.isEmpty()) { - standardOutput << QObject::tr("Either no data was currently available on the standard input for reading, or an error occurred for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; + standardOutput << QObject::tr("Either no data was currently available on " + "the standard input for reading, or an error " + "occurred for port %1, error: %2") + .arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } - qint64 bytesWritten = serialPort.write(writeData); + const qint64 bytesWritten = serialPort.write(writeData); if (bytesWritten == -1) { - standardOutput << QObject::tr("Failed to write the data to port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; + standardOutput << QObject::tr("Failed to write the data to port %1, error: %2") + .arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } else if (bytesWritten != writeData.size()) { - standardOutput << QObject::tr("Failed to write all the data to port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; + standardOutput << QObject::tr("Failed to write all the data to port %1, error: %2") + .arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } else if (!serialPort.waitForBytesWritten(5000)) { - standardOutput << QObject::tr("Operation timed out or an error occurred for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; + standardOutput << QObject::tr("Operation timed out or an error " + "occurred for port %1, error: %2") + .arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } - standardOutput << QObject::tr("Data successfully sent to port %1").arg(serialPortName) << endl; + standardOutput << QObject::tr("Data successfully sent to port %1") + .arg(serialPortName) << endl; return 0; } diff --git a/examples/serialport/enumerator/main.cpp b/examples/serialport/enumerator/main.cpp index d7622a20..fef1ce08 100644 --- a/examples/serialport/enumerator/main.cpp +++ b/examples/serialport/enumerator/main.cpp @@ -50,13 +50,11 @@ ****************************************************************************/ #include <QApplication> -#include <QWidget> -#include <QVBoxLayout> #include <QLabel> #include <QScrollArea> -#include <QtSerialPort/QSerialPortInfo> - -QT_USE_NAMESPACE +#include <QSerialPortInfo> +#include <QVBoxLayout> +#include <QWidget> int main(int argc, char *argv[]) { diff --git a/examples/serialport/master/dialog.cpp b/examples/serialport/master/dialog.cpp index 4bed08b9..e12d8372 100644 --- a/examples/serialport/master/dialog.cpp +++ b/examples/serialport/master/dialog.cpp @@ -50,106 +50,105 @@ #include "dialog.h" +#include <QComboBox> +#include <QGridLayout> #include <QLabel> #include <QLineEdit> -#include <QComboBox> -#include <QSpinBox> #include <QPushButton> -#include <QGridLayout> +#include <QSerialPortInfo> +#include <QSpinBox> -#include <QtSerialPort/QSerialPortInfo> - -QT_USE_NAMESPACE - -Dialog::Dialog(QWidget *parent) - : QDialog(parent) - , transactionCount(0) - , serialPortLabel(new QLabel(tr("Serial port:"))) - , serialPortComboBox(new QComboBox()) - , waitResponseLabel(new QLabel(tr("Wait response, msec:"))) - , waitResponseSpinBox(new QSpinBox()) - , requestLabel(new QLabel(tr("Request:"))) - , requestLineEdit(new QLineEdit(tr("Who are you?"))) - , trafficLabel(new QLabel(tr("No traffic."))) - , statusLabel(new QLabel(tr("Status: Not running."))) - , runButton(new QPushButton(tr("Start"))) +Dialog::Dialog(QWidget *parent) : + QDialog(parent), + m_transactionCount(0), + m_serialPortLabel(new QLabel(tr("Serial port:"))), + m_serialPortComboBox(new QComboBox), + m_waitResponseLabel(new QLabel(tr("Wait response, msec:"))), + m_waitResponseSpinBox(new QSpinBox), + m_requestLabel(new QLabel(tr("Request:"))), + m_requestLineEdit(new QLineEdit(tr("Who are you?"))), + m_trafficLabel(new QLabel(tr("No traffic."))), + m_statusLabel(new QLabel(tr("Status: Not running."))), + m_runButton(new QPushButton(tr("Start"))) { const auto infos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &info : infos) - serialPortComboBox->addItem(info.portName()); + m_serialPortComboBox->addItem(info.portName()); - waitResponseSpinBox->setRange(0, 10000); - waitResponseSpinBox->setValue(100); + m_waitResponseSpinBox->setRange(0, 10000); + m_waitResponseSpinBox->setValue(100); auto mainLayout = new QGridLayout; - mainLayout->addWidget(serialPortLabel, 0, 0); - mainLayout->addWidget(serialPortComboBox, 0, 1); - mainLayout->addWidget(waitResponseLabel, 1, 0); - mainLayout->addWidget(waitResponseSpinBox, 1, 1); - mainLayout->addWidget(runButton, 0, 2, 2, 1); - mainLayout->addWidget(requestLabel, 2, 0); - mainLayout->addWidget(requestLineEdit, 2, 1, 1, 3); - mainLayout->addWidget(trafficLabel, 3, 0, 1, 4); - mainLayout->addWidget(statusLabel, 4, 0, 1, 5); + mainLayout->addWidget(m_serialPortLabel, 0, 0); + mainLayout->addWidget(m_serialPortComboBox, 0, 1); + mainLayout->addWidget(m_waitResponseLabel, 1, 0); + mainLayout->addWidget(m_waitResponseSpinBox, 1, 1); + mainLayout->addWidget(m_runButton, 0, 2, 2, 1); + mainLayout->addWidget(m_requestLabel, 2, 0); + mainLayout->addWidget(m_requestLineEdit, 2, 1, 1, 3); + mainLayout->addWidget(m_trafficLabel, 3, 0, 1, 4); + mainLayout->addWidget(m_statusLabel, 4, 0, 1, 5); setLayout(mainLayout); setWindowTitle(tr("Master")); - serialPortComboBox->setFocus(); + m_serialPortComboBox->setFocus(); - timer.setSingleShot(true); + m_timer.setSingleShot(true); - connect(runButton, &QPushButton::clicked, this, &Dialog::sendRequest); - connect(&serial, &QSerialPort::readyRead, this, &Dialog::readResponse); - connect(&timer, &QTimer::timeout, this, &Dialog::processTimeout); + connect(m_runButton, &QPushButton::clicked, this, &Dialog::sendRequest); + connect(&m_serial, &QSerialPort::readyRead, this, &Dialog::readResponse); + connect(&m_timer, &QTimer::timeout, this, &Dialog::processTimeout); } void Dialog::sendRequest() { - if (serial.portName() != serialPortComboBox->currentText()) { - serial.close(); - serial.setPortName(serialPortComboBox->currentText()); + if (m_serial.portName() != m_serialPortComboBox->currentText()) { + m_serial.close(); + m_serial.setPortName(m_serialPortComboBox->currentText()); - if (!serial.open(QIODevice::ReadWrite)) { + if (!m_serial.open(QIODevice::ReadWrite)) { processError(tr("Can't open %1, error code %2") - .arg(serial.portName()).arg(serial.error())); + .arg(m_serial.portName()).arg(m_serial.error())); return; } } setControlsEnabled(false); - statusLabel->setText(tr("Status: Running, connected to port %1.") - .arg(serialPortComboBox->currentText())); + m_statusLabel->setText(tr("Status: Running, connected to port %1.") + .arg(m_serialPortComboBox->currentText())); - serial.write(requestLineEdit->text().toLocal8Bit()); - timer.start(waitResponseSpinBox->value()); + m_serial.write(m_requestLineEdit->text().toUtf8()); + m_timer.start(m_waitResponseSpinBox->value()); } void Dialog::readResponse() { - response.append(serial.readAll()); + m_response.append(m_serial.readAll()); } void Dialog::processTimeout() { setControlsEnabled(true); - trafficLabel->setText(tr("Traffic, transaction #%1:" - "\n\r-request: %2" - "\n\r-response: %3") - .arg(++transactionCount).arg(requestLineEdit->text()).arg(QString(response))); - response.clear(); + m_trafficLabel->setText(tr("Traffic, transaction #%1:" + "\n\r-request: %2" + "\n\r-response: %3") + .arg(++m_transactionCount) + .arg(m_requestLineEdit->text()) + .arg(QString::fromUtf8(m_response))); + m_response.clear(); } void Dialog::processError(const QString &error) { setControlsEnabled(true); - statusLabel->setText(tr("Status: Not running, %1.").arg(error)); - trafficLabel->setText(tr("No traffic.")); + m_statusLabel->setText(tr("Status: Not running, %1.").arg(error)); + m_trafficLabel->setText(tr("No traffic.")); } void Dialog::setControlsEnabled(bool enable) { - runButton->setEnabled(enable); - serialPortComboBox->setEnabled(enable); - waitResponseSpinBox->setEnabled(enable); - requestLineEdit->setEnabled(enable); + m_runButton->setEnabled(enable); + m_serialPortComboBox->setEnabled(enable); + m_waitResponseSpinBox->setEnabled(enable); + m_requestLineEdit->setEnabled(enable); } diff --git a/examples/serialport/master/dialog.h b/examples/serialport/master/dialog.h index 0bc12412..2fb2e8e9 100644 --- a/examples/serialport/master/dialog.h +++ b/examples/serialport/master/dialog.h @@ -52,12 +52,9 @@ #define DIALOG_H #include <QDialog> +#include <QSerialPort> #include <QTimer> -#include <QtSerialPort/QSerialPort> - -QT_USE_NAMESPACE - QT_BEGIN_NAMESPACE class QLabel; @@ -85,20 +82,20 @@ private: void processError(const QString &error); private: - int transactionCount; - QLabel *serialPortLabel; - QComboBox *serialPortComboBox; - QLabel *waitResponseLabel; - QSpinBox *waitResponseSpinBox; - QLabel *requestLabel; - QLineEdit *requestLineEdit; - QLabel *trafficLabel; - QLabel *statusLabel; - QPushButton *runButton; + int m_transactionCount = 0; + QLabel *m_serialPortLabel = nullptr; + QComboBox *m_serialPortComboBox = nullptr; + QLabel *m_waitResponseLabel = nullptr; + QSpinBox *m_waitResponseSpinBox = nullptr; + QLabel *m_requestLabel = nullptr; + QLineEdit *m_requestLineEdit = nullptr; + QLabel *m_trafficLabel = nullptr; + QLabel *m_statusLabel = nullptr; + QPushButton *m_runButton = nullptr; - QSerialPort serial; - QByteArray response; - QTimer timer; + QSerialPort m_serial; + QByteArray m_response; + QTimer m_timer; }; #endif // DIALOG_H diff --git a/examples/serialport/master/main.cpp b/examples/serialport/master/main.cpp index cf4c4211..8e68c730 100644 --- a/examples/serialport/master/main.cpp +++ b/examples/serialport/master/main.cpp @@ -48,10 +48,10 @@ ** ****************************************************************************/ -#include <QApplication> - #include "dialog.h" +#include <QApplication> + int main(int argc, char *argv[]) { QApplication app(argc, argv); diff --git a/examples/serialport/master/master.pro b/examples/serialport/master/master.pro index 354d1745..3eb9ddaa 100644 --- a/examples/serialport/master/master.pro +++ b/examples/serialport/master/master.pro @@ -1,5 +1,6 @@ greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets serialport + requires(qtConfig(combobox)) } else { include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) } diff --git a/examples/serialport/slave/dialog.cpp b/examples/serialport/slave/dialog.cpp index d8010520..eec79992 100644 --- a/examples/serialport/slave/dialog.cpp +++ b/examples/serialport/slave/dialog.cpp @@ -50,109 +50,106 @@ #include "dialog.h" +#include <QComboBox> +#include <QGridLayout> #include <QLabel> #include <QLineEdit> -#include <QComboBox> -#include <QSpinBox> #include <QPushButton> -#include <QGridLayout> +#include <QSerialPortInfo> +#include <QSpinBox> -#include <QtSerialPort/QSerialPortInfo> - -QT_USE_NAMESPACE - -Dialog::Dialog(QWidget *parent) - : QDialog(parent) - , transactionCount(0) - , serialPortLabel(new QLabel(tr("Serial port:"))) - , serialPortComboBox(new QComboBox()) - , waitRequestLabel(new QLabel(tr("Wait request, msec:"))) - , waitRequestSpinBox(new QSpinBox()) - , responseLabel(new QLabel(tr("Response:"))) - , responseLineEdit(new QLineEdit(tr("Hello, I'm Slave."))) - , trafficLabel(new QLabel(tr("No traffic."))) - , statusLabel(new QLabel(tr("Status: Not running."))) - , runButton(new QPushButton(tr("Start"))) +Dialog::Dialog(QWidget *parent) : + QDialog(parent), + m_serialPortLabel(new QLabel(tr("Serial port:"))), + m_serialPortComboBox(new QComboBox), + m_waitRequestLabel(new QLabel(tr("Wait request, msec:"))), + m_waitRequestSpinBox(new QSpinBox), + m_responseLabel(new QLabel(tr("Response:"))), + m_responseLineEdit(new QLineEdit(tr("Hello, I'm Slave."))), + m_trafficLabel(new QLabel(tr("No traffic."))), + m_statusLabel(new QLabel(tr("Status: Not running."))), + m_runButton(new QPushButton(tr("Start"))) { - waitRequestSpinBox->setRange(0, 10000); - waitRequestSpinBox->setValue(20); + m_waitRequestSpinBox->setRange(0, 10000); + m_waitRequestSpinBox->setValue(20); const auto infos = QSerialPortInfo::availablePorts(); for (const QSerialPortInfo &info : infos) - serialPortComboBox->addItem(info.portName()); + m_serialPortComboBox->addItem(info.portName()); auto mainLayout = new QGridLayout; - mainLayout->addWidget(serialPortLabel, 0, 0); - mainLayout->addWidget(serialPortComboBox, 0, 1); - mainLayout->addWidget(waitRequestLabel, 1, 0); - mainLayout->addWidget(waitRequestSpinBox, 1, 1); - mainLayout->addWidget(runButton, 0, 2, 2, 1); - mainLayout->addWidget(responseLabel, 2, 0); - mainLayout->addWidget(responseLineEdit, 2, 1, 1, 3); - mainLayout->addWidget(trafficLabel, 3, 0, 1, 4); - mainLayout->addWidget(statusLabel, 4, 0, 1, 5); + mainLayout->addWidget(m_serialPortLabel, 0, 0); + mainLayout->addWidget(m_serialPortComboBox, 0, 1); + mainLayout->addWidget(m_waitRequestLabel, 1, 0); + mainLayout->addWidget(m_waitRequestSpinBox, 1, 1); + mainLayout->addWidget(m_runButton, 0, 2, 2, 1); + mainLayout->addWidget(m_responseLabel, 2, 0); + mainLayout->addWidget(m_responseLineEdit, 2, 1, 1, 3); + mainLayout->addWidget(m_trafficLabel, 3, 0, 1, 4); + mainLayout->addWidget(m_statusLabel, 4, 0, 1, 5); setLayout(mainLayout); setWindowTitle(tr("Slave")); - serialPortComboBox->setFocus(); + m_serialPortComboBox->setFocus(); - timer.setSingleShot(true); + m_timer.setSingleShot(true); - connect(runButton, &QPushButton::clicked, this, &Dialog::startSlave); - connect(&serial, &QSerialPort::readyRead, this, &Dialog::readRequest); - connect(&timer, &QTimer::timeout, this, &Dialog::processTimeout); + connect(m_runButton, &QPushButton::clicked, this, &Dialog::startSlave); + connect(&m_serial, &QSerialPort::readyRead, this, &Dialog::readRequest); + connect(&m_timer, &QTimer::timeout, this, &Dialog::processTimeout); - connect(serialPortComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), + connect(m_serialPortComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Dialog::activateRunButton); - connect(waitRequestSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), + connect(m_waitRequestSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &Dialog::activateRunButton); - connect(responseLineEdit, &QLineEdit::textChanged, this, &Dialog::activateRunButton); + connect(m_responseLineEdit, &QLineEdit::textChanged, this, &Dialog::activateRunButton); } void Dialog::startSlave() { - if (serial.portName() != serialPortComboBox->currentText()) { - serial.close(); - serial.setPortName(serialPortComboBox->currentText()); + if (m_serial.portName() != m_serialPortComboBox->currentText()) { + m_serial.close(); + m_serial.setPortName(m_serialPortComboBox->currentText()); - if (!serial.open(QIODevice::ReadWrite)) { + if (!m_serial.open(QIODevice::ReadWrite)) { processError(tr("Can't open %1, error code %2") - .arg(serial.portName()).arg(serial.error())); + .arg(m_serial.portName()).arg(m_serial.error())); return; } } - runButton->setEnabled(false); - statusLabel->setText(tr("Status: Running, connected to port %1.") - .arg(serialPortComboBox->currentText())); + m_runButton->setEnabled(false); + m_statusLabel->setText(tr("Status: Running, connected to port %1.") + .arg(m_serialPortComboBox->currentText())); } void Dialog::readRequest() { - if (!timer.isActive()) - timer.start(waitRequestSpinBox->value()); - request.append(serial.readAll()); + if (!m_timer.isActive()) + m_timer.start(m_waitRequestSpinBox->value()); + m_request.append(m_serial.readAll()); } void Dialog::processTimeout() { - serial.write(responseLineEdit->text().toLocal8Bit()); - - trafficLabel->setText(tr("Traffic, transaction #%1:" - "\n\r-request: %2" - "\n\r-response: %3") - .arg(++transactionCount).arg(QString(request)).arg(responseLineEdit->text())); - request.clear(); + m_serial.write(m_responseLineEdit->text().toUtf8()); + + m_trafficLabel->setText(tr("Traffic, transaction #%1:" + "\n\r-request: %2" + "\n\r-response: %3") + .arg(++m_transactionCount).arg(QString::fromUtf8(m_request)) + .arg(m_responseLineEdit->text())); + m_request.clear(); } void Dialog::activateRunButton() { - runButton->setEnabled(true); + m_runButton->setEnabled(true); } void Dialog::processError(const QString &s) { activateRunButton(); - statusLabel->setText(tr("Status: Not running, %1.").arg(s)); - trafficLabel->setText(tr("No traffic.")); + m_statusLabel->setText(tr("Status: Not running, %1.").arg(s)); + m_trafficLabel->setText(tr("No traffic.")); } diff --git a/examples/serialport/slave/dialog.h b/examples/serialport/slave/dialog.h index 0405cf8c..13909c77 100644 --- a/examples/serialport/slave/dialog.h +++ b/examples/serialport/slave/dialog.h @@ -52,12 +52,9 @@ #define DIALOG_H #include <QDialog> +#include <QSerialPort> #include <QTimer> -#include <QtSerialPort/QSerialPort> - -QT_USE_NAMESPACE - QT_BEGIN_NAMESPACE class QLabel; @@ -85,20 +82,20 @@ private: void processError(const QString &s); private: - int transactionCount; - QLabel *serialPortLabel; - QComboBox *serialPortComboBox; - QLabel *waitRequestLabel; - QSpinBox *waitRequestSpinBox; - QLabel *responseLabel; - QLineEdit *responseLineEdit; - QLabel *trafficLabel; - QLabel *statusLabel; - QPushButton *runButton; + int m_transactionCount = 0; + QLabel *m_serialPortLabel = nullptr; + QComboBox *m_serialPortComboBox = nullptr; + QLabel *m_waitRequestLabel = nullptr; + QSpinBox *m_waitRequestSpinBox = nullptr; + QLabel *m_responseLabel = nullptr; + QLineEdit *m_responseLineEdit = nullptr; + QLabel *m_trafficLabel = nullptr; + QLabel *m_statusLabel = nullptr; + QPushButton *m_runButton = nullptr; - QSerialPort serial; - QByteArray request; - QTimer timer; + QSerialPort m_serial; + QByteArray m_request; + QTimer m_timer; }; #endif // DIALOG_H diff --git a/examples/serialport/slave/main.cpp b/examples/serialport/slave/main.cpp index cf4c4211..8e68c730 100644 --- a/examples/serialport/slave/main.cpp +++ b/examples/serialport/slave/main.cpp @@ -48,10 +48,10 @@ ** ****************************************************************************/ -#include <QApplication> - #include "dialog.h" +#include <QApplication> + int main(int argc, char *argv[]) { QApplication app(argc, argv); diff --git a/examples/serialport/slave/slave.pro b/examples/serialport/slave/slave.pro index 54e7d027..eb684ff6 100644 --- a/examples/serialport/slave/slave.pro +++ b/examples/serialport/slave/slave.pro @@ -1,5 +1,6 @@ greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets serialport + requires(qtConfig(combobox)) } else { include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) } diff --git a/examples/serialport/terminal/console.cpp b/examples/serialport/terminal/console.cpp index 4f8d5802..d71c5c01 100644 --- a/examples/serialport/terminal/console.cpp +++ b/examples/serialport/terminal/console.cpp @@ -53,23 +53,19 @@ #include <QScrollBar> -#include <QtCore/QDebug> - -Console::Console(QWidget *parent) - : QPlainTextEdit(parent) - , localEchoEnabled(false) +Console::Console(QWidget *parent) : + QPlainTextEdit(parent) { document()->setMaximumBlockCount(100); QPalette p = palette(); p.setColor(QPalette::Base, Qt::black); p.setColor(QPalette::Text, Qt::green); setPalette(p); - } void Console::putData(const QByteArray &data) { - insertPlainText(QString(data)); + insertPlainText(data); QScrollBar *bar = verticalScrollBar(); bar->setValue(bar->maximum()); @@ -77,7 +73,7 @@ void Console::putData(const QByteArray &data) void Console::setLocalEchoEnabled(bool set) { - localEchoEnabled = set; + m_localEchoEnabled = set; } void Console::keyPressEvent(QKeyEvent *e) @@ -90,7 +86,7 @@ void Console::keyPressEvent(QKeyEvent *e) case Qt::Key_Down: break; default: - if (localEchoEnabled) + if (m_localEchoEnabled) QPlainTextEdit::keyPressEvent(e); emit getData(e->text().toLocal8Bit()); } diff --git a/examples/serialport/terminal/console.h b/examples/serialport/terminal/console.h index 0674ded2..b9fe5532 100644 --- a/examples/serialport/terminal/console.h +++ b/examples/serialport/terminal/console.h @@ -65,18 +65,16 @@ public: explicit Console(QWidget *parent = nullptr); void putData(const QByteArray &data); - void setLocalEchoEnabled(bool set); protected: - void keyPressEvent(QKeyEvent *e) Q_DECL_OVERRIDE; - void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE; - void mouseDoubleClickEvent(QMouseEvent *e) Q_DECL_OVERRIDE; - void contextMenuEvent(QContextMenuEvent *e) Q_DECL_OVERRIDE; + void keyPressEvent(QKeyEvent *e) override; + void mousePressEvent(QMouseEvent *e) override; + void mouseDoubleClickEvent(QMouseEvent *e) override; + void contextMenuEvent(QContextMenuEvent *e) override; private: - bool localEchoEnabled; - + bool m_localEchoEnabled = false; }; #endif // CONSOLE_H diff --git a/examples/serialport/terminal/main.cpp b/examples/serialport/terminal/main.cpp index ec64e37d..a6e901ad 100644 --- a/examples/serialport/terminal/main.cpp +++ b/examples/serialport/terminal/main.cpp @@ -49,10 +49,10 @@ ** ****************************************************************************/ -#include <QApplication> - #include "mainwindow.h" +#include <QApplication> + int main(int argc, char *argv[]) { QApplication a(argc, argv); diff --git a/examples/serialport/terminal/mainwindow.cpp b/examples/serialport/terminal/mainwindow.cpp index f6e86cc2..e8ac9d71 100644 --- a/examples/serialport/terminal/mainwindow.cpp +++ b/examples/serialport/terminal/mainwindow.cpp @@ -54,73 +54,71 @@ #include "console.h" #include "settingsdialog.h" -#include <QMessageBox> #include <QLabel> -#include <QtSerialPort/QSerialPort> +#include <QMessageBox> //! [0] MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), - ui(new Ui::MainWindow) -{ -//! [0] - ui->setupUi(this); - console = new Console; - console->setEnabled(false); - setCentralWidget(console); + m_ui(new Ui::MainWindow), + m_status(new QLabel), + m_console(new Console), + m_settings(new SettingsDialog), //! [1] - serial = new QSerialPort(this); + m_serial(new QSerialPort(this)) //! [1] - settings = new SettingsDialog; +{ +//! [0] + m_ui->setupUi(this); + m_console->setEnabled(false); + setCentralWidget(m_console); - ui->actionConnect->setEnabled(true); - ui->actionDisconnect->setEnabled(false); - ui->actionQuit->setEnabled(true); - ui->actionConfigure->setEnabled(true); + m_ui->actionConnect->setEnabled(true); + m_ui->actionDisconnect->setEnabled(false); + m_ui->actionQuit->setEnabled(true); + m_ui->actionConfigure->setEnabled(true); - status = new QLabel; - ui->statusBar->addWidget(status); + m_ui->statusBar->addWidget(m_status); initActionsConnections(); - connect(serial, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), - this, &MainWindow::handleError); + connect(m_serial, &QSerialPort::errorOccurred, this, &MainWindow::handleError); //! [2] - connect(serial, &QSerialPort::readyRead, this, &MainWindow::readData); + connect(m_serial, &QSerialPort::readyRead, this, &MainWindow::readData); //! [2] - connect(console, &Console::getData, this, &MainWindow::writeData); + connect(m_console, &Console::getData, this, &MainWindow::writeData); //! [3] } //! [3] MainWindow::~MainWindow() { - delete settings; - delete ui; + delete m_settings; + delete m_ui; } //! [4] void MainWindow::openSerialPort() { - SettingsDialog::Settings p = settings->settings(); - serial->setPortName(p.name); - serial->setBaudRate(p.baudRate); - serial->setDataBits(p.dataBits); - serial->setParity(p.parity); - serial->setStopBits(p.stopBits); - serial->setFlowControl(p.flowControl); - if (serial->open(QIODevice::ReadWrite)) { - console->setEnabled(true); - console->setLocalEchoEnabled(p.localEchoEnabled); - ui->actionConnect->setEnabled(false); - ui->actionDisconnect->setEnabled(true); - ui->actionConfigure->setEnabled(false); + const SettingsDialog::Settings p = m_settings->settings(); + m_serial->setPortName(p.name); + m_serial->setBaudRate(p.baudRate); + m_serial->setDataBits(p.dataBits); + m_serial->setParity(p.parity); + m_serial->setStopBits(p.stopBits); + m_serial->setFlowControl(p.flowControl); + if (m_serial->open(QIODevice::ReadWrite)) { + m_console->setEnabled(true); + m_console->setLocalEchoEnabled(p.localEchoEnabled); + m_ui->actionConnect->setEnabled(false); + m_ui->actionDisconnect->setEnabled(true); + m_ui->actionConfigure->setEnabled(false); showStatusMessage(tr("Connected to %1 : %2, %3, %4, %5, %6") .arg(p.name).arg(p.stringBaudRate).arg(p.stringDataBits) .arg(p.stringParity).arg(p.stringStopBits).arg(p.stringFlowControl)); } else { - QMessageBox::critical(this, tr("Error"), serial->errorString()); + QMessageBox::critical(this, tr("Error"), m_serial->errorString()); showStatusMessage(tr("Open error")); } @@ -130,12 +128,12 @@ void MainWindow::openSerialPort() //! [5] void MainWindow::closeSerialPort() { - if (serial->isOpen()) - serial->close(); - console->setEnabled(false); - ui->actionConnect->setEnabled(true); - ui->actionDisconnect->setEnabled(false); - ui->actionConfigure->setEnabled(true); + if (m_serial->isOpen()) + m_serial->close(); + m_console->setEnabled(false); + m_ui->actionConnect->setEnabled(true); + m_ui->actionDisconnect->setEnabled(false); + m_ui->actionConfigure->setEnabled(true); showStatusMessage(tr("Disconnected")); } //! [5] @@ -151,15 +149,15 @@ void MainWindow::about() //! [6] void MainWindow::writeData(const QByteArray &data) { - serial->write(data); + m_serial->write(data); } //! [6] //! [7] void MainWindow::readData() { - QByteArray data = serial->readAll(); - console->putData(data); + const QByteArray data = m_serial->readAll(); + m_console->putData(data); } //! [7] @@ -167,7 +165,7 @@ void MainWindow::readData() void MainWindow::handleError(QSerialPort::SerialPortError error) { if (error == QSerialPort::ResourceError) { - QMessageBox::critical(this, tr("Critical Error"), serial->errorString()); + QMessageBox::critical(this, tr("Critical Error"), m_serial->errorString()); closeSerialPort(); } } @@ -175,16 +173,16 @@ void MainWindow::handleError(QSerialPort::SerialPortError error) void MainWindow::initActionsConnections() { - connect(ui->actionConnect, &QAction::triggered, this, &MainWindow::openSerialPort); - connect(ui->actionDisconnect, &QAction::triggered, this, &MainWindow::closeSerialPort); - connect(ui->actionQuit, &QAction::triggered, this, &MainWindow::close); - connect(ui->actionConfigure, &QAction::triggered, settings, &SettingsDialog::show); - connect(ui->actionClear, &QAction::triggered, console, &Console::clear); - connect(ui->actionAbout, &QAction::triggered, this, &MainWindow::about); - connect(ui->actionAboutQt, &QAction::triggered, qApp, &QApplication::aboutQt); + connect(m_ui->actionConnect, &QAction::triggered, this, &MainWindow::openSerialPort); + connect(m_ui->actionDisconnect, &QAction::triggered, this, &MainWindow::closeSerialPort); + connect(m_ui->actionQuit, &QAction::triggered, this, &MainWindow::close); + connect(m_ui->actionConfigure, &QAction::triggered, m_settings, &SettingsDialog::show); + connect(m_ui->actionClear, &QAction::triggered, m_console, &Console::clear); + connect(m_ui->actionAbout, &QAction::triggered, this, &MainWindow::about); + connect(m_ui->actionAboutQt, &QAction::triggered, qApp, &QApplication::aboutQt); } void MainWindow::showStatusMessage(const QString &message) { - status->setText(message); + m_status->setText(message); } diff --git a/examples/serialport/terminal/mainwindow.h b/examples/serialport/terminal/mainwindow.h index b792895b..eebae8c5 100644 --- a/examples/serialport/terminal/mainwindow.h +++ b/examples/serialport/terminal/mainwindow.h @@ -52,11 +52,8 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H -#include <QtCore/QtGlobal> - #include <QMainWindow> - -#include <QtSerialPort/QSerialPort> +#include <QSerialPort> QT_BEGIN_NAMESPACE @@ -94,11 +91,11 @@ private: private: void showStatusMessage(const QString &message); - Ui::MainWindow *ui; - QLabel *status; - Console *console; - SettingsDialog *settings; - QSerialPort *serial; + Ui::MainWindow *m_ui = nullptr; + QLabel *m_status = nullptr; + Console *m_console = nullptr; + SettingsDialog *m_settings = nullptr; + QSerialPort *m_serial = nullptr; }; #endif // MAINWINDOW_H diff --git a/examples/serialport/terminal/settingsdialog.cpp b/examples/serialport/terminal/settingsdialog.cpp index f9b86057..4b16bf56 100644 --- a/examples/serialport/terminal/settingsdialog.cpp +++ b/examples/serialport/terminal/settingsdialog.cpp @@ -52,31 +52,28 @@ #include "settingsdialog.h" #include "ui_settingsdialog.h" -#include <QtSerialPort/QSerialPortInfo> #include <QIntValidator> #include <QLineEdit> - -QT_USE_NAMESPACE +#include <QSerialPortInfo> static const char blankString[] = QT_TRANSLATE_NOOP("SettingsDialog", "N/A"); SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), - ui(new Ui::SettingsDialog) + m_ui(new Ui::SettingsDialog), + m_intValidator(new QIntValidator(0, 4000000, this)) { - ui->setupUi(this); - - intValidator = new QIntValidator(0, 4000000, this); + m_ui->setupUi(this); - ui->baudRateBox->setInsertPolicy(QComboBox::NoInsert); + m_ui->baudRateBox->setInsertPolicy(QComboBox::NoInsert); - connect(ui->applyButton, &QPushButton::clicked, + connect(m_ui->applyButton, &QPushButton::clicked, this, &SettingsDialog::apply); - connect(ui->serialPortInfoListBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), + connect(m_ui->serialPortInfoListBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &SettingsDialog::showPortInfo); - connect(ui->baudRateBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), + connect(m_ui->baudRateBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &SettingsDialog::checkCustomBaudRatePolicy); - connect(ui->serialPortInfoListBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), + connect(m_ui->serialPortInfoListBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &SettingsDialog::checkCustomDevicePathPolicy); fillPortsParameters(); @@ -87,12 +84,12 @@ SettingsDialog::SettingsDialog(QWidget *parent) : SettingsDialog::~SettingsDialog() { - delete ui; + delete m_ui; } SettingsDialog::Settings SettingsDialog::settings() const { - return currentSettings; + return m_currentSettings; } void SettingsDialog::showPortInfo(int idx) @@ -100,13 +97,13 @@ void SettingsDialog::showPortInfo(int idx) if (idx == -1) return; - QStringList list = ui->serialPortInfoListBox->itemData(idx).toStringList(); - ui->descriptionLabel->setText(tr("Description: %1").arg(list.count() > 1 ? list.at(1) : tr(blankString))); - ui->manufacturerLabel->setText(tr("Manufacturer: %1").arg(list.count() > 2 ? list.at(2) : tr(blankString))); - ui->serialNumberLabel->setText(tr("Serial number: %1").arg(list.count() > 3 ? list.at(3) : tr(blankString))); - ui->locationLabel->setText(tr("Location: %1").arg(list.count() > 4 ? list.at(4) : tr(blankString))); - ui->vidLabel->setText(tr("Vendor Identifier: %1").arg(list.count() > 5 ? list.at(5) : tr(blankString))); - ui->pidLabel->setText(tr("Product Identifier: %1").arg(list.count() > 6 ? list.at(6) : tr(blankString))); + const QStringList list = m_ui->serialPortInfoListBox->itemData(idx).toStringList(); + m_ui->descriptionLabel->setText(tr("Description: %1").arg(list.count() > 1 ? list.at(1) : tr(blankString))); + m_ui->manufacturerLabel->setText(tr("Manufacturer: %1").arg(list.count() > 2 ? list.at(2) : tr(blankString))); + m_ui->serialNumberLabel->setText(tr("Serial number: %1").arg(list.count() > 3 ? list.at(3) : tr(blankString))); + m_ui->locationLabel->setText(tr("Location: %1").arg(list.count() > 4 ? list.at(4) : tr(blankString))); + m_ui->vidLabel->setText(tr("Vendor Identifier: %1").arg(list.count() > 5 ? list.at(5) : tr(blankString))); + m_ui->pidLabel->setText(tr("Product Identifier: %1").arg(list.count() > 6 ? list.at(6) : tr(blankString))); } void SettingsDialog::apply() @@ -117,57 +114,57 @@ void SettingsDialog::apply() void SettingsDialog::checkCustomBaudRatePolicy(int idx) { - bool isCustomBaudRate = !ui->baudRateBox->itemData(idx).isValid(); - ui->baudRateBox->setEditable(isCustomBaudRate); + const bool isCustomBaudRate = !m_ui->baudRateBox->itemData(idx).isValid(); + m_ui->baudRateBox->setEditable(isCustomBaudRate); if (isCustomBaudRate) { - ui->baudRateBox->clearEditText(); - QLineEdit *edit = ui->baudRateBox->lineEdit(); - edit->setValidator(intValidator); + m_ui->baudRateBox->clearEditText(); + QLineEdit *edit = m_ui->baudRateBox->lineEdit(); + edit->setValidator(m_intValidator); } } void SettingsDialog::checkCustomDevicePathPolicy(int idx) { - bool isCustomPath = !ui->serialPortInfoListBox->itemData(idx).isValid(); - ui->serialPortInfoListBox->setEditable(isCustomPath); + const bool isCustomPath = !m_ui->serialPortInfoListBox->itemData(idx).isValid(); + m_ui->serialPortInfoListBox->setEditable(isCustomPath); if (isCustomPath) - ui->serialPortInfoListBox->clearEditText(); + m_ui->serialPortInfoListBox->clearEditText(); } void SettingsDialog::fillPortsParameters() { - ui->baudRateBox->addItem(QStringLiteral("9600"), QSerialPort::Baud9600); - ui->baudRateBox->addItem(QStringLiteral("19200"), QSerialPort::Baud19200); - ui->baudRateBox->addItem(QStringLiteral("38400"), QSerialPort::Baud38400); - ui->baudRateBox->addItem(QStringLiteral("115200"), QSerialPort::Baud115200); - ui->baudRateBox->addItem(tr("Custom")); - - ui->dataBitsBox->addItem(QStringLiteral("5"), QSerialPort::Data5); - ui->dataBitsBox->addItem(QStringLiteral("6"), QSerialPort::Data6); - ui->dataBitsBox->addItem(QStringLiteral("7"), QSerialPort::Data7); - ui->dataBitsBox->addItem(QStringLiteral("8"), QSerialPort::Data8); - ui->dataBitsBox->setCurrentIndex(3); - - ui->parityBox->addItem(tr("None"), QSerialPort::NoParity); - ui->parityBox->addItem(tr("Even"), QSerialPort::EvenParity); - ui->parityBox->addItem(tr("Odd"), QSerialPort::OddParity); - ui->parityBox->addItem(tr("Mark"), QSerialPort::MarkParity); - ui->parityBox->addItem(tr("Space"), QSerialPort::SpaceParity); - - ui->stopBitsBox->addItem(QStringLiteral("1"), QSerialPort::OneStop); + m_ui->baudRateBox->addItem(QStringLiteral("9600"), QSerialPort::Baud9600); + m_ui->baudRateBox->addItem(QStringLiteral("19200"), QSerialPort::Baud19200); + m_ui->baudRateBox->addItem(QStringLiteral("38400"), QSerialPort::Baud38400); + m_ui->baudRateBox->addItem(QStringLiteral("115200"), QSerialPort::Baud115200); + m_ui->baudRateBox->addItem(tr("Custom")); + + m_ui->dataBitsBox->addItem(QStringLiteral("5"), QSerialPort::Data5); + m_ui->dataBitsBox->addItem(QStringLiteral("6"), QSerialPort::Data6); + m_ui->dataBitsBox->addItem(QStringLiteral("7"), QSerialPort::Data7); + m_ui->dataBitsBox->addItem(QStringLiteral("8"), QSerialPort::Data8); + m_ui->dataBitsBox->setCurrentIndex(3); + + m_ui->parityBox->addItem(tr("None"), QSerialPort::NoParity); + m_ui->parityBox->addItem(tr("Even"), QSerialPort::EvenParity); + m_ui->parityBox->addItem(tr("Odd"), QSerialPort::OddParity); + m_ui->parityBox->addItem(tr("Mark"), QSerialPort::MarkParity); + m_ui->parityBox->addItem(tr("Space"), QSerialPort::SpaceParity); + + m_ui->stopBitsBox->addItem(QStringLiteral("1"), QSerialPort::OneStop); #ifdef Q_OS_WIN - ui->stopBitsBox->addItem(tr("1.5"), QSerialPort::OneAndHalfStop); + m_ui->stopBitsBox->addItem(tr("1.5"), QSerialPort::OneAndHalfStop); #endif - ui->stopBitsBox->addItem(QStringLiteral("2"), QSerialPort::TwoStop); + m_ui->stopBitsBox->addItem(QStringLiteral("2"), QSerialPort::TwoStop); - ui->flowControlBox->addItem(tr("None"), QSerialPort::NoFlowControl); - ui->flowControlBox->addItem(tr("RTS/CTS"), QSerialPort::HardwareControl); - ui->flowControlBox->addItem(tr("XON/XOFF"), QSerialPort::SoftwareControl); + m_ui->flowControlBox->addItem(tr("None"), QSerialPort::NoFlowControl); + m_ui->flowControlBox->addItem(tr("RTS/CTS"), QSerialPort::HardwareControl); + m_ui->flowControlBox->addItem(tr("XON/XOFF"), QSerialPort::SoftwareControl); } void SettingsDialog::fillPortsInfo() { - ui->serialPortInfoListBox->clear(); + m_ui->serialPortInfoListBox->clear(); QString description; QString manufacturer; QString serialNumber; @@ -185,39 +182,39 @@ void SettingsDialog::fillPortsInfo() << (info.vendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : blankString) << (info.productIdentifier() ? QString::number(info.productIdentifier(), 16) : blankString); - ui->serialPortInfoListBox->addItem(list.first(), list); + m_ui->serialPortInfoListBox->addItem(list.first(), list); } - ui->serialPortInfoListBox->addItem(tr("Custom")); + m_ui->serialPortInfoListBox->addItem(tr("Custom")); } void SettingsDialog::updateSettings() { - currentSettings.name = ui->serialPortInfoListBox->currentText(); + m_currentSettings.name = m_ui->serialPortInfoListBox->currentText(); - if (ui->baudRateBox->currentIndex() == 4) { - currentSettings.baudRate = ui->baudRateBox->currentText().toInt(); + if (m_ui->baudRateBox->currentIndex() == 4) { + m_currentSettings.baudRate = m_ui->baudRateBox->currentText().toInt(); } else { - currentSettings.baudRate = static_cast<QSerialPort::BaudRate>( - ui->baudRateBox->itemData(ui->baudRateBox->currentIndex()).toInt()); + m_currentSettings.baudRate = static_cast<QSerialPort::BaudRate>( + m_ui->baudRateBox->itemData(m_ui->baudRateBox->currentIndex()).toInt()); } - currentSettings.stringBaudRate = QString::number(currentSettings.baudRate); + m_currentSettings.stringBaudRate = QString::number(m_currentSettings.baudRate); - currentSettings.dataBits = static_cast<QSerialPort::DataBits>( - ui->dataBitsBox->itemData(ui->dataBitsBox->currentIndex()).toInt()); - currentSettings.stringDataBits = ui->dataBitsBox->currentText(); + m_currentSettings.dataBits = static_cast<QSerialPort::DataBits>( + m_ui->dataBitsBox->itemData(m_ui->dataBitsBox->currentIndex()).toInt()); + m_currentSettings.stringDataBits = m_ui->dataBitsBox->currentText(); - currentSettings.parity = static_cast<QSerialPort::Parity>( - ui->parityBox->itemData(ui->parityBox->currentIndex()).toInt()); - currentSettings.stringParity = ui->parityBox->currentText(); + m_currentSettings.parity = static_cast<QSerialPort::Parity>( + m_ui->parityBox->itemData(m_ui->parityBox->currentIndex()).toInt()); + m_currentSettings.stringParity = m_ui->parityBox->currentText(); - currentSettings.stopBits = static_cast<QSerialPort::StopBits>( - ui->stopBitsBox->itemData(ui->stopBitsBox->currentIndex()).toInt()); - currentSettings.stringStopBits = ui->stopBitsBox->currentText(); + m_currentSettings.stopBits = static_cast<QSerialPort::StopBits>( + m_ui->stopBitsBox->itemData(m_ui->stopBitsBox->currentIndex()).toInt()); + m_currentSettings.stringStopBits = m_ui->stopBitsBox->currentText(); - currentSettings.flowControl = static_cast<QSerialPort::FlowControl>( - ui->flowControlBox->itemData(ui->flowControlBox->currentIndex()).toInt()); - currentSettings.stringFlowControl = ui->flowControlBox->currentText(); + m_currentSettings.flowControl = static_cast<QSerialPort::FlowControl>( + m_ui->flowControlBox->itemData(m_ui->flowControlBox->currentIndex()).toInt()); + m_currentSettings.stringFlowControl = m_ui->flowControlBox->currentText(); - currentSettings.localEchoEnabled = ui->localEchoCheckBox->isChecked(); + m_currentSettings.localEchoEnabled = m_ui->localEchoCheckBox->isChecked(); } diff --git a/examples/serialport/terminal/settingsdialog.h b/examples/serialport/terminal/settingsdialog.h index ea249c19..4c0cda1a 100644 --- a/examples/serialport/terminal/settingsdialog.h +++ b/examples/serialport/terminal/settingsdialog.h @@ -53,9 +53,7 @@ #define SETTINGSDIALOG_H #include <QDialog> -#include <QtSerialPort/QSerialPort> - -QT_USE_NAMESPACE +#include <QSerialPort> QT_BEGIN_NAMESPACE @@ -104,9 +102,9 @@ private: void updateSettings(); private: - Ui::SettingsDialog *ui; - Settings currentSettings; - QIntValidator *intValidator; + Ui::SettingsDialog *m_ui = nullptr; + Settings m_currentSettings; + QIntValidator *m_intValidator = nullptr; }; #endif // SETTINGSDIALOG_H diff --git a/examples/serialport/terminal/terminal.pro b/examples/serialport/terminal/terminal.pro index 4dbed02d..fda5a8a9 100644 --- a/examples/serialport/terminal/terminal.pro +++ b/examples/serialport/terminal/terminal.pro @@ -1,4 +1,5 @@ QT += widgets serialport +requires(qtConfig(combobox)) TARGET = terminal TEMPLATE = app diff --git a/src/serialport/doc/src/index.qdoc b/src/serialport/doc/src/index.qdoc index 3b0f7624..041188e0 100644 --- a/src/serialport/doc/src/index.qdoc +++ b/src/serialport/doc/src/index.qdoc @@ -43,11 +43,18 @@ \li Pinout signal change notification. \endlist - To use these classes in your application, use the following include + To use the serial port in your application, add the following include statement: \code - #include <QtSerialPort/QtSerialPort> + #include <QSerialPort> + \endcode + + For information about available serial ports, use the following include + statement: + + \code + #include <QSerialPortInfo> \endcode To link against the module, add this line to your \l qmake \c diff --git a/src/serialport/doc/src/qtserialport-module.qdoc b/src/serialport/doc/src/qtserialport-module.qdoc index 325b7800..6c153a00 100644 --- a/src/serialport/doc/src/qtserialport-module.qdoc +++ b/src/serialport/doc/src/qtserialport-module.qdoc @@ -32,11 +32,17 @@ \qtvariable serialport \brief List of C++ classes that enable access to a serial port. - To use these classes in your application, use the following include + To use QSerialPort in your application, add the following include statement: \code - #include <QtSerialPort/QtSerialPort> + #include <QSerialPort> + \endcode + + For QSerialPortInfo, use the following include statement: + + \code + #include <QSerialPortInfo> \endcode To link against the module, add this line to your \l qmake \c diff --git a/src/serialport/qserialport.cpp b/src/serialport/qserialport.cpp index 8ea5a483..a53212ff 100644 --- a/src/serialport/qserialport.cpp +++ b/src/serialport/qserialport.cpp @@ -87,42 +87,12 @@ QSerialPortErrorInfo::QSerialPortErrorInfo(QSerialPort::SerialPortError newError } QSerialPortPrivate::QSerialPortPrivate() - : readBufferMaxSize(0) - , error(QSerialPort::NoError) - , inputBaudRate(9600) - , outputBaudRate(9600) - , dataBits(QSerialPort::Data8) - , parity(QSerialPort::NoParity) - , stopBits(QSerialPort::OneStop) - , flowControl(QSerialPort::NoFlowControl) -#if QT_DEPRECATED_SINCE(5,3) - , settingsRestoredOnClose(true) -#endif - , isBreakEnabled(false) #if defined(Q_OS_WIN32) - , handle(INVALID_HANDLE_VALUE) - , readChunkBuffer(ReadChunkSize, 0) - , communicationStarted(false) - , writeStarted(false) - , readStarted(false) - , notifier(0) - , startAsyncWriteTimer(0) - , originalEventMask(0) - , triggeredEventMask(0) -#elif defined(Q_OS_UNIX) - , descriptor(-1) - , readNotifier(0) - , writeNotifier(0) - , readPortNotifierCalled(false) - , readPortNotifierState(false) - , readPortNotifierStateSet(false) - , emittedReadyRead(false) - , emittedBytesWritten(false) - , pendingBytesWritten(0) - , writeSequenceStarted(false) + : readChunkBuffer(QSERIALPORT_BUFFERSIZE, 0) #endif { - writeBufferChunkSize = InitialBufferSize; + writeBufferChunkSize = QSERIALPORT_BUFFERSIZE; + readBufferChunkSize = QSERIALPORT_BUFFERSIZE; } void QSerialPortPrivate::setError(const QSerialPortErrorInfo &errorInfo) @@ -1244,10 +1214,9 @@ qint64 QSerialPort::readBufferSize() const void QSerialPort::setReadBufferSize(qint64 size) { Q_D(QSerialPort); - - if (d->readBufferMaxSize == size) - return; d->readBufferMaxSize = size; + if (isReadable()) + d->startAsyncRead(); } /*! @@ -1427,30 +1396,21 @@ bool QSerialPort::isBreakEnabled() const /*! \reimp + + \omit + This function does not really read anything, as we use QIODevicePrivate's + buffer. The buffer will be read inside of QIODevice before this + method will be called. + \endomit */ -// This function does not really read anything, as we use QIODevicePrivate's -// buffer. The buffer will be read inside of QIODevice before this -// method will be called. qint64 QSerialPort::readData(char *data, qint64 maxSize) { Q_UNUSED(data); Q_UNUSED(maxSize); -#if defined(Q_OS_WIN32) - // We need try to start async reading to read a remainder from a driver's queue - // in case we have a limited read buffer size. Because the read notification can - // be stalled since Windows do not re-triggered an EV_RXCHAR event if a driver's - // buffer has a remainder of data ready to read until a new data will be received. - Q_D(QSerialPort); - if (d->readBufferMaxSize || d->flowControl == QSerialPort::HardwareControl) - d->startAsyncRead(); -#elif defined(Q_OS_UNIX) - // We need try to re-trigger the read notification to read a remainder from a - // driver's queue in case we have a limited read buffer size. - Q_D(QSerialPort); - if (d->readBufferMaxSize && !d->isReadNotificationEnabled()) - d->setReadNotificationEnabled(true); -#endif + // In any case we need to start the notifications if they were + // disabled by the read handler. If enabled, next call does nothing. + d_func()->startAsyncRead(); // return 0 indicating there may be more data in the future return qint64(0); diff --git a/src/serialport/qserialport.h b/src/serialport/qserialport.h index e4a61eda..655297c8 100644 --- a/src/serialport/qserialport.h +++ b/src/serialport/qserialport.h @@ -210,8 +210,8 @@ public: void setPort(const QSerialPortInfo &info); - bool open(OpenMode mode) Q_DECL_OVERRIDE; - void close() Q_DECL_OVERRIDE; + bool open(OpenMode mode) override; + void close() override; #if QT_DEPRECATED_SINCE(5, 3) QT_DEPRECATED void setSettingsRestoredOnClose(bool restore); @@ -243,7 +243,7 @@ public: bool flush(); bool clear(Directions directions = AllDirections); - bool atEnd() const Q_DECL_OVERRIDE; // ### Qt6: remove me + bool atEnd() const override; // ### Qt6: remove me #if QT_DEPRECATED_SINCE(5, 2) QT_DEPRECATED bool setDataErrorPolicy(DataErrorPolicy policy = IgnorePolicy); @@ -256,14 +256,14 @@ public: qint64 readBufferSize() const; void setReadBufferSize(qint64 size); - bool isSequential() const Q_DECL_OVERRIDE; + bool isSequential() const override; - qint64 bytesAvailable() const Q_DECL_OVERRIDE; - qint64 bytesToWrite() const Q_DECL_OVERRIDE; - bool canReadLine() const Q_DECL_OVERRIDE; + qint64 bytesAvailable() const override; + qint64 bytesToWrite() const override; + bool canReadLine() const override; - bool waitForReadyRead(int msecs = 30000) Q_DECL_OVERRIDE; - bool waitForBytesWritten(int msecs = 30000) Q_DECL_OVERRIDE; + bool waitForReadyRead(int msecs = 30000) override; + bool waitForBytesWritten(int msecs = 30000) override; #if QT_DEPRECATED_SINCE(5, 5) QT_DEPRECATED bool sendBreak(int duration = 0); @@ -294,9 +294,9 @@ Q_SIGNALS: void breakEnabledChanged(bool set); protected: - qint64 readData(char *data, qint64 maxSize) Q_DECL_OVERRIDE; - qint64 readLineData(char *data, qint64 maxSize) Q_DECL_OVERRIDE; - qint64 writeData(const char *data, qint64 maxSize) Q_DECL_OVERRIDE; + qint64 readData(char *data, qint64 maxSize) override; + qint64 readLineData(char *data, qint64 maxSize) override; + qint64 writeData(const char *data, qint64 maxSize) override; private: // ### Qt6: remove me. diff --git a/src/serialport/qserialport_p.h b/src/serialport/qserialport_p.h index 10fda340..b0955aef 100644 --- a/src/serialport/qserialport_p.h +++ b/src/serialport/qserialport_p.h @@ -56,6 +56,7 @@ #include "qserialport.h" #include <private/qiodevice_p.h> +#include <qdeadlinetimer.h> #if defined(Q_OS_WIN32) # include <qt_windows.h> @@ -97,9 +98,12 @@ struct serial_struct { # error Unsupported OS #endif +#ifndef QSERIALPORT_BUFFERSIZE +#define QSERIALPORT_BUFFERSIZE 32768 +#endif + QT_BEGIN_NAMESPACE -class QThread; class QWinOverlappedIoNotifier; class QTimer; class QSocketNotifier; @@ -113,7 +117,7 @@ class QSerialPortErrorInfo public: explicit QSerialPortErrorInfo(QSerialPort::SerialPortError newErrorCode = QSerialPort::UnknownError, const QString &newErrorString = QString()); - QSerialPort::SerialPortError errorCode; + QSerialPort::SerialPortError errorCode = QSerialPort::UnknownError; QString errorString; }; @@ -121,11 +125,6 @@ class QSerialPortPrivate : public QIODevicePrivate { Q_DECLARE_PUBLIC(QSerialPort) public: - enum IoConstants { - ReadChunkSize = 512, - InitialBufferSize = 16384 - }; - QSerialPortPrivate(); bool open(QIODevice::OpenMode mode); @@ -158,33 +157,32 @@ public: qint64 writeData(const char *data, qint64 maxSize); + bool initialize(QIODevice::OpenMode mode); + static QString portNameToSystemLocation(const QString &port); static QString portNameFromSystemLocation(const QString &location); -#if defined(Q_OS_UNIX) - static qint32 settingFromBaudRate(qint32 baudRate); -#endif - static QList<qint32> standardBaudRates(); - qint64 readBufferMaxSize; - QSerialPort::SerialPortError error; + qint64 readBufferMaxSize = 0; + QSerialPort::SerialPortError error = QSerialPort::NoError; QString systemLocation; - qint32 inputBaudRate; - qint32 outputBaudRate; - QSerialPort::DataBits dataBits; - QSerialPort::Parity parity; - QSerialPort::StopBits stopBits; - QSerialPort::FlowControl flowControl; - bool settingsRestoredOnClose; - bool isBreakEnabled; + qint32 inputBaudRate = QSerialPort::Baud9600; + qint32 outputBaudRate = QSerialPort::Baud9600; + QSerialPort::DataBits dataBits = QSerialPort::Data8; + QSerialPort::Parity parity = QSerialPort::NoParity; + QSerialPort::StopBits stopBits = QSerialPort::OneStop; + QSerialPort::FlowControl flowControl = QSerialPort::NoFlowControl; + bool settingsRestoredOnClose = true; + bool isBreakEnabled = false; + + bool startAsyncRead(); #if defined(Q_OS_WIN32) - bool initialize(); bool setDcb(DCB *dcb); bool getDcb(DCB *dcb); - OVERLAPPED *waitForNotified(int msecs); + OVERLAPPED *waitForNotified(QDeadlineTimer deadline); qint64 queuedBytesCount(QSerialPort::Direction direction) const; @@ -193,7 +191,6 @@ public: bool completeAsyncWrite(qint64 bytesTransferred); bool startAsyncCommunication(); - bool startAsyncRead(); bool _q_startAsyncWrite(); void _q_notified(DWORD numberOfBytes, DWORD errorCode, OVERLAPPED *overlapped); @@ -202,23 +199,23 @@ public: DCB restoredDcb; COMMTIMEOUTS currentCommTimeouts; COMMTIMEOUTS restoredCommTimeouts; - HANDLE handle; + HANDLE handle = INVALID_HANDLE_VALUE; QByteArray readChunkBuffer; QByteArray writeChunkBuffer; - bool communicationStarted; - bool writeStarted; - bool readStarted; - QWinOverlappedIoNotifier *notifier; - QTimer *startAsyncWriteTimer; + bool communicationStarted = false; + bool writeStarted = false; + bool readStarted = false; + QWinOverlappedIoNotifier *notifier = nullptr; + QTimer *startAsyncWriteTimer = nullptr; OVERLAPPED communicationOverlapped; OVERLAPPED readCompletionOverlapped; OVERLAPPED writeCompletionOverlapped; - DWORD originalEventMask; - DWORD triggeredEventMask; + DWORD triggeredEventMask = 0; #elif defined(Q_OS_UNIX) - bool initialize(QIODevice::OpenMode mode); + static qint32 settingFromBaudRate(qint32 baudRate); + bool setTermios(const termios *tio); bool getTermios(termios *tio); @@ -246,20 +243,20 @@ public: bool completeAsyncWrite(); struct termios restoredTermios; - int descriptor; + int descriptor = -1; - QSocketNotifier *readNotifier; - QSocketNotifier *writeNotifier; + QSocketNotifier *readNotifier = nullptr; + QSocketNotifier *writeNotifier = nullptr; - bool readPortNotifierCalled; - bool readPortNotifierState; - bool readPortNotifierStateSet; + bool readPortNotifierCalled = false; + bool readPortNotifierState = false; + bool readPortNotifierStateSet = false; - bool emittedReadyRead; - bool emittedBytesWritten; + bool emittedReadyRead = false; + bool emittedBytesWritten = false; - qint64 pendingBytesWritten; - bool writeSequenceStarted; + qint64 pendingBytesWritten = 0; + bool writeSequenceStarted = false; QScopedPointer<QLockFile> lockFileScopedPointer; diff --git a/src/serialport/qserialport_unix.cpp b/src/serialport/qserialport_unix.cpp index 4df1fcba..a13a2890 100644 --- a/src/serialport/qserialport_unix.cpp +++ b/src/serialport/qserialport_unix.cpp @@ -42,10 +42,17 @@ #include "qserialport_p.h" #include "qserialportinfo_p.h" +#include <QtCore/qelapsedtimer.h> +#include <QtCore/qmap.h> +#include <QtCore/qsocketnotifier.h> +#include <QtCore/qstandardpaths.h> + +#include <private/qcore_unix_p.h> + #include <errno.h> -#include <sys/time.h> -#include <sys/ioctl.h> #include <fcntl.h> +#include <sys/ioctl.h> +#include <sys/time.h> #include <unistd.h> #ifdef Q_OS_OSX @@ -93,16 +100,6 @@ struct termios2 { #endif -#include <private/qcore_unix_p.h> - -#include <QtCore/qelapsedtimer.h> -#include <QtCore/qsocketnotifier.h> -#include <QtCore/qmap.h> - -#ifdef Q_OS_OSX -#include <QtCore/qstandardpaths.h> -#endif - QT_BEGIN_NAMESPACE QString serialPortLockFilePath(const QString &portName) @@ -118,12 +115,8 @@ QString serialPortLockFilePath(const QString &portName) << QStringLiteral("/run/lock") #ifdef Q_OS_ANDROID << QStringLiteral("/data/local/tmp") -#elif defined(Q_OS_OSX) - // This is the workaround to specify a temporary directory - // on OSX when running the App Sandbox feature. - << QStandardPaths::writableLocation(QStandardPaths::TempLocation); #endif - ; + << QStandardPaths::writableLocation(QStandardPaths::TempLocation); QString fileName = portName; fileName.replace(QLatin1Char('/'), QLatin1Char('_')); @@ -156,14 +149,14 @@ QString serialPortLockFilePath(const QString &portName) class ReadNotifier : public QSocketNotifier { public: - ReadNotifier(QSerialPortPrivate *d, QObject *parent) + explicit ReadNotifier(QSerialPortPrivate *d, QObject *parent) : QSocketNotifier(d->descriptor, QSocketNotifier::Read, parent) , dptr(d) { } protected: - bool event(QEvent *e) Q_DECL_OVERRIDE + bool event(QEvent *e) override { if (e->type() == QEvent::SockAct) { dptr->readNotification(); @@ -173,20 +166,20 @@ protected: } private: - QSerialPortPrivate *dptr; + QSerialPortPrivate * const dptr; }; class WriteNotifier : public QSocketNotifier { public: - WriteNotifier(QSerialPortPrivate *d, QObject *parent) + explicit WriteNotifier(QSerialPortPrivate *d, QObject *parent) : QSocketNotifier(d->descriptor, QSocketNotifier::Write, parent) , dptr(d) { } protected: - bool event(QEvent *e) Q_DECL_OVERRIDE + bool event(QEvent *e) override { if (e->type() == QEvent::SockAct) { dptr->completeAsyncWrite(); @@ -196,7 +189,7 @@ protected: } private: - QSerialPortPrivate *dptr; + QSerialPortPrivate * const dptr; }; static inline void qt_set_common_props(termios *tio, QIODevice::OpenMode m) @@ -763,13 +756,19 @@ bool QSerialPortPrivate::setFlowControl(QSerialPort::FlowControl flowControl) return setTermios(&tio); } +bool QSerialPortPrivate::startAsyncRead() +{ + setReadNotificationEnabled(true); + return true; +} + bool QSerialPortPrivate::readNotification() { Q_Q(QSerialPort); // Always buffered, read data from the port into the read buffer qint64 newBytes = buffer.size(); - qint64 bytesToRead = ReadChunkSize; + qint64 bytesToRead = QSERIALPORT_BUFFERSIZE; if (readBufferMaxSize && bytesToRead > (readBufferMaxSize - buffer.size())) { bytesToRead = readBufferMaxSize - buffer.size(); @@ -798,10 +797,6 @@ bool QSerialPortPrivate::readNotification() newBytes = buffer.size() - newBytes; - // If read buffer is full, disable the read port notifier. - if (readBufferMaxSize && buffer.size() == readBufferMaxSize) - setReadNotificationEnabled(false); - // only emit readyRead() when not recursing, and only if there is data available const bool hasData = newBytes > 0; diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp index 87f9e7b6..f90a7ef4 100644 --- a/src/serialport/qserialport_win.cpp +++ b/src/serialport/qserialport_win.cpp @@ -40,12 +40,12 @@ ****************************************************************************/ #include "qserialport_p.h" +#include "qwinoverlappedionotifier_p.h" #include <QtCore/qcoreevent.h> #include <QtCore/qelapsedtimer.h> #include <QtCore/qvector.h> #include <QtCore/qtimer.h> -#include <private/qwinoverlappedionotifier_p.h> #include <algorithm> #ifndef CTL_CODE @@ -176,12 +176,9 @@ static inline void qt_set_flowcontrol(DCB *dcb, QSerialPort::FlowControl flowcon bool QSerialPortPrivate::open(QIODevice::OpenMode mode) { DWORD desiredAccess = 0; - originalEventMask = 0; - if (mode & QIODevice::ReadOnly) { + if (mode & QIODevice::ReadOnly) desiredAccess |= GENERIC_READ; - originalEventMask |= EV_RXCHAR; - } if (mode & QIODevice::WriteOnly) desiredAccess |= GENERIC_WRITE; @@ -193,7 +190,7 @@ bool QSerialPortPrivate::open(QIODevice::OpenMode mode) return false; } - if (initialize()) + if (initialize(mode)) return true; ::CloseHandle(handle); @@ -347,18 +344,16 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs) const qint64 initialReadBufferSize = buffer.size(); qint64 currentReadBufferSize = initialReadBufferSize; - QElapsedTimer stopWatch; - stopWatch.start(); + QDeadlineTimer deadline(msecs); do { - const OVERLAPPED *overlapped = waitForNotified( - qt_subtract_from_timeout(msecs, stopWatch.elapsed())); + const OVERLAPPED *overlapped = waitForNotified(deadline); if (!overlapped) return false; if (overlapped == &readCompletionOverlapped) { const qint64 readBytesForOneReadOperation = qint64(buffer.size()) - currentReadBufferSize; - if (readBytesForOneReadOperation == ReadChunkSize) { + if (readBytesForOneReadOperation == QSERIALPORT_BUFFERSIZE) { currentReadBufferSize = buffer.size(); } else if (readBytesForOneReadOperation == 0) { if (initialReadBufferSize != currentReadBufferSize) @@ -368,7 +363,7 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs) } } - } while (msecs == -1 || qt_subtract_from_timeout(msecs, stopWatch.elapsed()) > 0); + } while (!deadline.hasExpired()); return false; } @@ -381,12 +376,10 @@ bool QSerialPortPrivate::waitForBytesWritten(int msecs) if (!writeStarted && !_q_startAsyncWrite()) return false; - QElapsedTimer stopWatch; - stopWatch.start(); + QDeadlineTimer deadline(msecs); for (;;) { - const OVERLAPPED *overlapped = waitForNotified( - qt_subtract_from_timeout(msecs, stopWatch.elapsed())); + const OVERLAPPED *overlapped = waitForNotified(deadline); if (!overlapped) return false; @@ -484,11 +477,10 @@ bool QSerialPortPrivate::completeAsyncRead(qint64 bytesTransferred) readStarted = false; bool result = true; - if (bytesTransferred == ReadChunkSize + if (bytesTransferred == QSERIALPORT_BUFFERSIZE || queuedBytesCount(QSerialPort::Input) > 0) { result = startAsyncRead(); - } else if (readBufferMaxSize == 0 - || readBufferMaxSize > buffer.size()) { + } else { result = startAsyncCommunication(); } @@ -541,7 +533,7 @@ bool QSerialPortPrivate::startAsyncRead() if (readStarted) return true; - qint64 bytesToRead = ReadChunkSize; + qint64 bytesToRead = QSERIALPORT_BUFFERSIZE; if (readBufferMaxSize && bytesToRead > (readBufferMaxSize - buffer.size())) { bytesToRead = readBufferMaxSize - buffer.size(); @@ -552,6 +544,8 @@ bool QSerialPortPrivate::startAsyncRead() } } + Q_ASSERT(int(bytesToRead) <= readChunkBuffer.size()); + ::ZeroMemory(&readCompletionOverlapped, sizeof(readCompletionOverlapped)); if (::ReadFile(handle, readChunkBuffer.data(), bytesToRead, nullptr, &readCompletionOverlapped)) { readStarted = true; @@ -638,9 +632,9 @@ qint64 QSerialPortPrivate::writeData(const char *data, qint64 maxSize) return maxSize; } -OVERLAPPED *QSerialPortPrivate::waitForNotified(int msecs) +OVERLAPPED *QSerialPortPrivate::waitForNotified(QDeadlineTimer deadline) { - OVERLAPPED *overlapped = notifier->waitForAnyNotified(msecs); + OVERLAPPED *overlapped = notifier->waitForAnyNotified(deadline); if (!overlapped) { setError(getSystemError(WAIT_TIMEOUT)); return nullptr; @@ -658,7 +652,7 @@ qint64 QSerialPortPrivate::queuedBytesCount(QSerialPort::Direction direction) co : ((direction == QSerialPort::Output) ? comstat.cbOutQue : -1); } -inline bool QSerialPortPrivate::initialize() +inline bool QSerialPortPrivate::initialize(QIODevice::OpenMode mode) { Q_Q(QSerialPort); @@ -691,20 +685,21 @@ inline bool QSerialPortPrivate::initialize() return false; } - if (!::SetCommMask(handle, originalEventMask)) { + const DWORD eventMask = (mode & QIODevice::ReadOnly) ? EV_RXCHAR : 0; + if (!::SetCommMask(handle, eventMask)) { setError(getSystemError()); return false; } + if ((eventMask & EV_RXCHAR) && !startAsyncCommunication()) + return false; + notifier = new QWinOverlappedIoNotifier(q); QObjectPrivate::connect(notifier, &QWinOverlappedIoNotifier::notified, this, &QSerialPortPrivate::_q_notified); notifier->setHandle(handle); notifier->setEnabled(true); - if ((originalEventMask & EV_RXCHAR) && !startAsyncCommunication()) - return false; - return true; } @@ -785,80 +780,16 @@ QSerialPortErrorInfo QSerialPortPrivate::getSystemError(int systemErrorCode) con } // This table contains standard values of baud rates that -// are defined in MSDN and/or in Win SDK file winbase.h - -static const QList<qint32> standardBaudRatePairList() -{ - - static const QList<qint32> standardBaudRatesTable = QList<qint32>() - - #ifdef CBR_110 - << CBR_110 - #endif - - #ifdef CBR_300 - << CBR_300 - #endif - - #ifdef CBR_600 - << CBR_600 - #endif - - #ifdef CBR_1200 - << CBR_1200 - #endif - - #ifdef CBR_2400 - << CBR_2400 - #endif - - #ifdef CBR_4800 - << CBR_4800 - #endif - - #ifdef CBR_9600 - << CBR_9600 - #endif - - #ifdef CBR_14400 - << CBR_14400 - #endif - - #ifdef CBR_19200 - << CBR_19200 - #endif - - #ifdef CBR_38400 - << CBR_38400 - #endif - - #ifdef CBR_56000 - << CBR_56000 - #endif - - #ifdef CBR_57600 - << CBR_57600 - #endif - - #ifdef CBR_115200 - << CBR_115200 - #endif - - #ifdef CBR_128000 - << CBR_128000 - #endif - - #ifdef CBR_256000 - << CBR_256000 - #endif - ; - - return standardBaudRatesTable; -}; - +// are defined in file winbase.h QList<qint32> QSerialPortPrivate::standardBaudRates() { - return standardBaudRatePairList(); + static const QList<qint32> baudRates = { + CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, + CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, + CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000 + }; + + return baudRates; } QSerialPort::Handle QSerialPort::handle() const diff --git a/src/serialport/qserialportinfo_p.h b/src/serialport/qserialportinfo_p.h index 483ff8cc..405cc419 100644 --- a/src/serialport/qserialportinfo_p.h +++ b/src/serialport/qserialportinfo_p.h @@ -60,18 +60,6 @@ QT_BEGIN_NAMESPACE class Q_AUTOTEST_EXPORT QSerialPortInfoPrivate { public: - QSerialPortInfoPrivate() - : vendorIdentifier(0) - , productIdentifier(0) - , hasVendorIdentifier(false) - , hasProductIdentifier(false) - { - } - - ~QSerialPortInfoPrivate() - { - } - static QString portNameToSystemLocation(const QString &source); static QString portNameFromSystemLocation(const QString &source); @@ -81,11 +69,11 @@ public: QString manufacturer; QString serialNumber; - quint16 vendorIdentifier; - quint16 productIdentifier; + quint16 vendorIdentifier = 0; + quint16 productIdentifier = 0; - bool hasVendorIdentifier; - bool hasProductIdentifier; + bool hasVendorIdentifier = false; + bool hasProductIdentifier = false; }; class QSerialPortInfoPrivateDeleter diff --git a/src/serialport/qwinoverlappedionotifier.cpp b/src/serialport/qwinoverlappedionotifier.cpp new file mode 100644 index 00000000..615dacc9 --- /dev/null +++ b/src/serialport/qwinoverlappedionotifier.cpp @@ -0,0 +1,420 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qwinoverlappedionotifier_p.h" +#include <qdebug.h> +#include <qatomic.h> +#include <qelapsedtimer.h> +#include <qmutex.h> +#include <qpointer.h> +#include <qqueue.h> +#include <qset.h> +#include <qthread.h> +#include <qt_windows.h> +#include <private/qobject_p.h> +#include <private/qiodevice_p.h> + +QT_BEGIN_NAMESPACE + +/*! + \class QWinOverlappedIoNotifier + \inmodule QtCore + \brief The QWinOverlappedIoNotifier class provides support for overlapped I/O notifications on Windows. + \since 5.0 + \internal + + The QWinOverlappedIoNotifier class makes it possible to use efficient + overlapped (asynchronous) I/O notifications on Windows by using an + I/O completion port. + + Once you have obtained a file handle, you can use setHandle() to get + notifications for I/O operations. Whenever an I/O operation completes, + the notified() signal is emitted which will pass the number of transferred + bytes, the operation's error code and a pointer to the operation's + OVERLAPPED object to the receiver. + + Every handle that supports overlapped I/O can be used by + QWinOverlappedIoNotifier. That includes file handles, TCP sockets + and named pipes. + + Note that you must not use ReadFileEx() and WriteFileEx() together + with QWinOverlappedIoNotifier. They are not supported as they use a + different I/O notification mechanism. + + The hEvent member in the OVERLAPPED structure passed to ReadFile() + or WriteFile() is ignored and can be used for other purposes. + + \warning This class is only available on Windows. + + Due to peculiarities of the Windows I/O completion port API, users of + QWinOverlappedIoNotifier must pay attention to the following restrictions: + \list + \li File handles with a QWinOverlappedIoNotifer are assigned to an I/O + completion port until the handle is closed. It is impossible to + disassociate the file handle from the I/O completion port. + \li There can be only one QWinOverlappedIoNotifer per file handle. Creating + another QWinOverlappedIoNotifier for that file, even with a duplicated + handle, will fail. + \li Certain Windows API functions are unavailable for file handles that are + assigned to an I/O completion port. This includes the functions + \c{ReadFileEx} and \c{WriteFileEx}. + \endlist + See also the remarks in the MSDN documentation for the + \c{CreateIoCompletionPort} function. +*/ + +struct IOResult +{ + IOResult(DWORD n = 0, DWORD e = 0, OVERLAPPED *p = nullptr) + : numberOfBytes(n), errorCode(e), overlapped(p) + {} + + DWORD numberOfBytes = 0; + DWORD errorCode = 0; + OVERLAPPED *overlapped = nullptr; +}; + + +class QWinIoCompletionPort; + +class QWinOverlappedIoNotifierPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QWinOverlappedIoNotifier) +public: + OVERLAPPED *waitForAnyNotified(QDeadlineTimer deadline); + void notify(DWORD numberOfBytes, DWORD errorCode, OVERLAPPED *overlapped); + void _q_notified(); + OVERLAPPED *dispatchNextIoResult(); + + static QWinIoCompletionPort *iocp; + static HANDLE iocpInstanceLock; + static unsigned int iocpInstanceRefCount; + HANDLE hHandle = INVALID_HANDLE_VALUE; + HANDLE hSemaphore = nullptr; + HANDLE hResultsMutex = nullptr; + QAtomicInt waiting; + QQueue<IOResult> results; +}; + +QWinIoCompletionPort *QWinOverlappedIoNotifierPrivate::iocp = 0; +HANDLE QWinOverlappedIoNotifierPrivate::iocpInstanceLock = CreateMutex(NULL, FALSE, NULL); +unsigned int QWinOverlappedIoNotifierPrivate::iocpInstanceRefCount = 0; + + +class QWinIoCompletionPort : protected QThread +{ +public: + QWinIoCompletionPort() + : finishThreadKey(reinterpret_cast<ULONG_PTR>(this)), + drainQueueKey(reinterpret_cast<ULONG_PTR>(this + 1)) + { + setObjectName(QLatin1String("I/O completion port thread")); + HANDLE hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); + if (!hIOCP) { + qErrnoWarning("CreateIoCompletionPort failed."); + return; + } + hPort = hIOCP; + hQueueDrainedEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!hQueueDrainedEvent) { + qErrnoWarning("CreateEvent failed."); + return; + } + } + + ~QWinIoCompletionPort() + { + PostQueuedCompletionStatus(hPort, 0, finishThreadKey, NULL); + QThread::wait(); + CloseHandle(hPort); + CloseHandle(hQueueDrainedEvent); + } + + void registerNotifier(QWinOverlappedIoNotifierPrivate *notifier) + { + const HANDLE hHandle = notifier->hHandle; + HANDLE hIOCP = CreateIoCompletionPort(hHandle, hPort, + reinterpret_cast<ULONG_PTR>(notifier), 0); + if (!hIOCP) { + qErrnoWarning("Can't associate file handle %x with I/O completion port.", hHandle); + return; + } + mutex.lock(); + notifiers += notifier; + mutex.unlock(); + if (!QThread::isRunning()) + QThread::start(); + } + + void unregisterNotifier(QWinOverlappedIoNotifierPrivate *notifier) + { + mutex.lock(); + notifiers.remove(notifier); + mutex.unlock(); + } + + void drainQueue() + { + QMutexLocker locker(&drainQueueMutex); + ResetEvent(hQueueDrainedEvent); + PostQueuedCompletionStatus(hPort, 0, drainQueueKey, NULL); + WaitForSingleObject(hQueueDrainedEvent, INFINITE); + } + + using QThread::isRunning; + +protected: + void run() + { + DWORD dwBytesRead = 0; + ULONG_PTR pulCompletionKey = 0; + OVERLAPPED *overlapped = nullptr; + DWORD msecs = INFINITE; + + forever { + BOOL success = GetQueuedCompletionStatus(hPort, + &dwBytesRead, + &pulCompletionKey, + &overlapped, + msecs); + + DWORD errorCode = success ? ERROR_SUCCESS : GetLastError(); + if (!success && !overlapped) { + if (!msecs) { + // Time out in drain mode. The completion status queue is empty. + msecs = INFINITE; + SetEvent(hQueueDrainedEvent); + continue; + } + qErrnoWarning(errorCode, "GetQueuedCompletionStatus failed."); + return; + } + + if (pulCompletionKey == finishThreadKey) + return; + if (pulCompletionKey == drainQueueKey) { + // Enter drain mode. + Q_ASSERT(msecs == INFINITE); + msecs = 0; + continue; + } + + QWinOverlappedIoNotifierPrivate *notifier + = reinterpret_cast<QWinOverlappedIoNotifierPrivate *>(pulCompletionKey); + mutex.lock(); + if (notifiers.contains(notifier)) + notifier->notify(dwBytesRead, errorCode, overlapped); + mutex.unlock(); + } + } + +private: + const ULONG_PTR finishThreadKey; + const ULONG_PTR drainQueueKey; + HANDLE hPort = INVALID_HANDLE_VALUE; + QSet<QWinOverlappedIoNotifierPrivate *> notifiers; + QMutex mutex; + QMutex drainQueueMutex; + HANDLE hQueueDrainedEvent = nullptr; +}; + + +QWinOverlappedIoNotifier::QWinOverlappedIoNotifier(QObject *parent) + : QObject(*new QWinOverlappedIoNotifierPrivate, parent) +{ + Q_D(QWinOverlappedIoNotifier); + WaitForSingleObject(d->iocpInstanceLock, INFINITE); + if (!d->iocp) + d->iocp = new QWinIoCompletionPort; + d->iocpInstanceRefCount++; + ReleaseMutex(d->iocpInstanceLock); + + d->hSemaphore = CreateSemaphore(NULL, 0, 255, NULL); + d->hResultsMutex = CreateMutex(NULL, FALSE, NULL); + connect(this, SIGNAL(_q_notify()), this, SLOT(_q_notified()), Qt::QueuedConnection); +} + +QWinOverlappedIoNotifier::~QWinOverlappedIoNotifier() +{ + Q_D(QWinOverlappedIoNotifier); + setEnabled(false); + CloseHandle(d->hResultsMutex); + CloseHandle(d->hSemaphore); + + WaitForSingleObject(d->iocpInstanceLock, INFINITE); + if (!--d->iocpInstanceRefCount) { + delete d->iocp; + d->iocp = 0; + } + ReleaseMutex(d->iocpInstanceLock); +} + +void QWinOverlappedIoNotifier::setHandle(Qt::HANDLE h) +{ + Q_D(QWinOverlappedIoNotifier); + d->hHandle = h; +} + +Qt::HANDLE QWinOverlappedIoNotifier::handle() const +{ + Q_D(const QWinOverlappedIoNotifier); + return d->hHandle; +} + +void QWinOverlappedIoNotifier::setEnabled(bool enabled) +{ + Q_D(QWinOverlappedIoNotifier); + if (enabled) + d->iocp->registerNotifier(d); + else + d->iocp->unregisterNotifier(d); +} + +OVERLAPPED *QWinOverlappedIoNotifierPrivate::waitForAnyNotified(QDeadlineTimer deadline) +{ + if (!iocp->isRunning()) { + qWarning("Called QWinOverlappedIoNotifier::waitForAnyNotified on inactive notifier."); + return 0; + } + + DWORD msecs = deadline.remainingTime(); + if (msecs == 0) + iocp->drainQueue(); + if (msecs == -1) + msecs = INFINITE; + + const DWORD wfso = WaitForSingleObject(hSemaphore, msecs); + switch (wfso) { + case WAIT_OBJECT_0: + return dispatchNextIoResult(); + case WAIT_TIMEOUT: + return 0; + default: + qErrnoWarning("QWinOverlappedIoNotifier::waitForAnyNotified: WaitForSingleObject failed."); + return 0; + } +} + +class QScopedAtomicIntIncrementor +{ +public: + QScopedAtomicIntIncrementor(QAtomicInt &i) + : m_int(i) + { + ++m_int; + } + + ~QScopedAtomicIntIncrementor() + { + --m_int; + } + +private: + QAtomicInt &m_int; +}; + +/*! + * Wait synchronously for any notified signal. + * + * The function returns a pointer to the OVERLAPPED object corresponding to the completed I/O + * operation. In case no I/O operation was completed during the \a msec timeout, this function + * returns a null pointer. + */ +OVERLAPPED *QWinOverlappedIoNotifier::waitForAnyNotified(QDeadlineTimer deadline) +{ + Q_D(QWinOverlappedIoNotifier); + QScopedAtomicIntIncrementor saii(d->waiting); + OVERLAPPED *result = d->waitForAnyNotified(deadline); + return result; +} + +/*! + * Wait synchronously for the notified signal. + * + * The function returns true if the notified signal was emitted for + * the I/O operation that corresponds to the OVERLAPPED object. + */ +bool QWinOverlappedIoNotifier::waitForNotified(QDeadlineTimer deadline, OVERLAPPED *overlapped) +{ + Q_D(QWinOverlappedIoNotifier); + QScopedAtomicIntIncrementor saii(d->waiting); + while (!deadline.hasExpired()) { + OVERLAPPED *triggeredOverlapped = waitForAnyNotified(deadline); + if (!triggeredOverlapped) + return false; + if (triggeredOverlapped == overlapped) + return true; + } + return false; +} + +/* + * Note: This function runs in the I/O completion port thread. + */ +void QWinOverlappedIoNotifierPrivate::notify(DWORD numberOfBytes, DWORD errorCode, + OVERLAPPED *overlapped) +{ + Q_Q(QWinOverlappedIoNotifier); + WaitForSingleObject(hResultsMutex, INFINITE); + results.enqueue(IOResult(numberOfBytes, errorCode, overlapped)); + ReleaseMutex(hResultsMutex); + ReleaseSemaphore(hSemaphore, 1, NULL); + if (!waiting) + emit q->_q_notify(); +} + +void QWinOverlappedIoNotifierPrivate::_q_notified() +{ + if (WaitForSingleObject(hSemaphore, 0) == WAIT_OBJECT_0) + dispatchNextIoResult(); +} + +OVERLAPPED *QWinOverlappedIoNotifierPrivate::dispatchNextIoResult() +{ + Q_Q(QWinOverlappedIoNotifier); + WaitForSingleObject(hResultsMutex, INFINITE); + IOResult ioresult = results.dequeue(); + ReleaseMutex(hResultsMutex); + emit q->notified(ioresult.numberOfBytes, ioresult.errorCode, ioresult.overlapped); + return ioresult.overlapped; +} + +QT_END_NAMESPACE + +#include "moc_qwinoverlappedionotifier_p.cpp" diff --git a/src/serialport/qwinoverlappedionotifier_p.h b/src/serialport/qwinoverlappedionotifier_p.h new file mode 100644 index 00000000..9ee998bd --- /dev/null +++ b/src/serialport/qwinoverlappedionotifier_p.h @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWINOVERLAPPEDIONOTIFIER_P_H +#define QWINOVERLAPPEDIONOTIFIER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/private/qglobal_p.h> +#include <qobject.h> +#include <qdeadlinetimer.h> + +typedef struct _OVERLAPPED OVERLAPPED; + +QT_BEGIN_NAMESPACE + +class QWinOverlappedIoNotifierPrivate; + +class QWinOverlappedIoNotifier : public QObject +{ + Q_OBJECT + Q_DISABLE_COPY(QWinOverlappedIoNotifier) + Q_DECLARE_PRIVATE(QWinOverlappedIoNotifier) + Q_PRIVATE_SLOT(d_func(), void _q_notified()) + friend class QWinIoCompletionPort; +public: + QWinOverlappedIoNotifier(QObject *parent = 0); + ~QWinOverlappedIoNotifier(); + + void setHandle(Qt::HANDLE h); + Qt::HANDLE handle() const; + + void setEnabled(bool enabled); + OVERLAPPED *waitForAnyNotified(QDeadlineTimer deadline); + bool waitForNotified(QDeadlineTimer deadline, OVERLAPPED *overlapped); + +Q_SIGNALS: + void notified(quint32 numberOfBytes, quint32 errorCode, OVERLAPPED *overlapped); +#if !defined(Q_QDOC) + void _q_notify(); +#endif +}; + +QT_END_NAMESPACE + +#endif // QWINOVERLAPPEDIONOTIFIER_P_H diff --git a/src/serialport/serialport-lib.pri b/src/serialport/serialport-lib.pri index 9f83989f..bb12df27 100644 --- a/src/serialport/serialport-lib.pri +++ b/src/serialport/serialport-lib.pri @@ -22,7 +22,11 @@ SOURCES += \ win32:!wince* { SOURCES += \ $$PWD/qserialport_win.cpp \ - $$PWD/qserialportinfo_win.cpp + $$PWD/qserialportinfo_win.cpp \ + $$PWD/qwinoverlappedionotifier.cpp + + PRIVATE_HEADERS += \ + $$PWD/qwinoverlappedionotifier_p.h LIBS_PRIVATE += -lsetupapi -ladvapi32 } diff --git a/tests/auto/bic/data/QtSerialPort.5.10.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtSerialPort.5.10.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..0121ab64 --- /dev/null +++ b/tests/auto/bic/data/QtSerialPort.5.10.0.linux-gcc-amd64.txt @@ -0,0 +1,4595 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7f3d6ee0fc00) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7f3d6eecf3c0) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7f3d6eecf600) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7f3d6eecf840) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7f3d6eecfa80) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7f3d6eecfc00) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7f3d6cb0a000) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7f3d6cb8c780) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7f3d6cb8c840) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7f3d6cb8cba0) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7f3d6cb8cc60) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7f3d6cb8cd20) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7f3d6cb8cde0) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7f3d6cbcb0c0) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7f3d6cbcb2a0) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f3d6cbcb720) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f3d6cbcb780) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f3d6cc6f420) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f3d6cc6f480) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f3d6cb7a888) 0 empty + std::input_iterator_tag (0x0x7f3d6cc6f4e0) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f3d6cb7a8f0) 0 empty + std::forward_iterator_tag (0x0x7f3d6cb7a958) 0 empty + std::input_iterator_tag (0x0x7f3d6cc6f540) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f3d6cb7a9c0) 0 empty + std::bidirectional_iterator_tag (0x0x7f3d6cb7aa28) 0 empty + std::forward_iterator_tag (0x0x7f3d6cb7aa90) 0 empty + std::input_iterator_tag (0x0x7f3d6cc6f5a0) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7f3d6ccd3240) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7f3d6ccd32a0) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7f3d6ccd3300) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7f3d6ccd3360) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7f3d6ccd33c0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f3d6ccd3ea0) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f3d6c9d8120) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f3d6c9d81e0) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f3d6c9d8240) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f3d6c9d8300) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f3d6c9d8360) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f3d6c9d87e0) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f3d6c9d8840) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7f3d6c9d88a0) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7f3d6cab7000) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f3d6c9d8900) 0 nearly-empty + primary-for std::bad_exception (0x0x7f3d6cab7000) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7f3d6c9d8960) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7f3d6c9d89c0) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7f3d6cab7208) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f3d6c9d8de0) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f3d6cab7208) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7f3d6cab7270) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7f3d6cab72d8) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7f3d6cab7270) + std::exception (0x0x7f3d6c9d8e40) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f3d6cab72d8) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f3d6c9d8ea0) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f3d6cb03ae0) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f3d6c52a7e0) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f3d6c52a840) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7f3d6c5ed720) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f3d6c5ed780) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f3d6c5ed840) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f3d6c5ed8a0) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f3d6c5ed900) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f3d6c5ed960) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f3d6c5eda80) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f3d6c5edae0) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f3d6c5edf00) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f3d6c5edf60) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7f3d6c13f780) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7f3d6c13f7e0) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f3d6c18c780) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f3d6bf825a0) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f3d6c142888) 0 + std::iterator<std::random_access_iterator_tag, bool> (0x0x7f3d6bf82660) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f3d6c142b60) 0 + std::_Bit_iterator_base (0x0x7f3d6c142bc8) 0 + std::iterator<std::random_access_iterator_tag, bool> (0x0x7f3d6bf826c0) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f3d6c07c000) 0 + std::_Bit_iterator_base (0x0x7f3d6c07c068) 0 + std::iterator<std::random_access_iterator_tag, bool> (0x0x7f3d6bf82720) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7f3d6bd98540) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7f3d6beaf300) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7f3d6beaf2a0) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7f3d6bc382a0) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f3d6aab6d80) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f3d6aab6de0) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f3d6a8308a0) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f3d6a830900) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f3d6a830960) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f3d6a8309c0) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f3d6a830c60) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7f3d6a8b31e0) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7f3d6a81bf08) 0 + std::__atomic_flag_base (0x0x7f3d6a8b3240) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f3d6a606680) 0 + QAtomicInteger<int> (0x0x7f3d6a6066e8) 0 + QBasicAtomicInteger<int> (0x0x7f3d6a314960) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f3d6a25af00) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f3d6a0a1f60) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f3d6a1030c0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f3d6a107138) 0 + QGenericArgument (0x0x7f3d6a103120) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f3d6a1032a0) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f3d6a103360) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f3d69dcc3c0) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f3d69dcc420) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f3d69dcc6c0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f3d69dcc720) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7f3d69dcca80) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f3d69dccae0) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7f3d69dccb40) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f3d69dccba0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f3d69dccc00) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7f3d69b6e000) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7f3d69ee2750) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7f3d69b6e0c0) 0 nearly-empty + primary-for std::logic_error (0x0x7f3d69ee2750) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7f3d69ee27b8) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7f3d69ee2820) 0 + primary-for std::domain_error (0x0x7f3d69ee27b8) + std::exception (0x0x7f3d69b6e120) 0 nearly-empty + primary-for std::logic_error (0x0x7f3d69ee2820) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7f3d69ee2888) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7f3d69ee28f0) 0 + primary-for std::invalid_argument (0x0x7f3d69ee2888) + std::exception (0x0x7f3d69b6e180) 0 nearly-empty + primary-for std::logic_error (0x0x7f3d69ee28f0) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7f3d69ee2958) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7f3d69ee29c0) 0 + primary-for std::length_error (0x0x7f3d69ee2958) + std::exception (0x0x7f3d69b6e1e0) 0 nearly-empty + primary-for std::logic_error (0x0x7f3d69ee29c0) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7f3d69ee2a28) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7f3d69ee2a90) 0 + primary-for std::out_of_range (0x0x7f3d69ee2a28) + std::exception (0x0x7f3d69b6e240) 0 nearly-empty + primary-for std::logic_error (0x0x7f3d69ee2a90) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7f3d69ee2af8) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7f3d69b6e2a0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f3d69ee2af8) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7f3d69ee2b60) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7f3d69ee2bc8) 0 + primary-for std::range_error (0x0x7f3d69ee2b60) + std::exception (0x0x7f3d69b6e300) 0 nearly-empty + primary-for std::runtime_error (0x0x7f3d69ee2bc8) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7f3d69ee2c30) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7f3d69ee2c98) 0 + primary-for std::overflow_error (0x0x7f3d69ee2c30) + std::exception (0x0x7f3d69b6e360) 0 nearly-empty + primary-for std::runtime_error (0x0x7f3d69ee2c98) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7f3d69ee2d00) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7f3d69ee2d68) 0 + primary-for std::underflow_error (0x0x7f3d69ee2d00) + std::exception (0x0x7f3d69b6e3c0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f3d69ee2d68) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7f3d69b6e540) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7f3d69b6e780) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7f3d69b6e900) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7f3d69bd91a0) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7f3d69bd9208) 0 + primary-for std::system_error (0x0x7f3d69bd91a0) + std::exception (0x0x7f3d69b6eb40) 0 nearly-empty + primary-for std::runtime_error (0x0x7f3d69bd9208) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7f3d69bd9dd0) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7f3d69bd9e38) 0 + primary-for std::ios_base::failure (0x0x7f3d69bd9dd0) + std::runtime_error (0x0x7f3d69bd9ea0) 0 + primary-for std::system_error (0x0x7f3d69bd9e38) + std::exception (0x0x7f3d69b6ee40) 0 nearly-empty + primary-for std::runtime_error (0x0x7f3d69bd9ea0) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f3d69b6eea0) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f3d69b6ef00) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f3d69b6ef60) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7f3d69b6ede0) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7f3d69c4b720) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f3d69c4bde0) 0 empty + +VTT for std::basic_ostream<char> +std::basic_ostream<char>::_ZTTSo: 2u entries +0 ((& std::basic_ostream<char>::_ZTVSo) + 24u) +8 ((& std::basic_ostream<char>::_ZTVSo) + 64u) + +VTT for std::basic_ostream<wchar_t> +std::basic_ostream<wchar_t>::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream<wchar_t>::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream<wchar_t>::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream<char> +std::basic_istream<char>::_ZTTSi: 2u entries +0 ((& std::basic_istream<char>::_ZTVSi) + 24u) +8 ((& std::basic_istream<char>::_ZTVSi) + 64u) + +VTT for std::basic_istream<wchar_t> +std::basic_istream<wchar_t>::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream<wchar_t>::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream<wchar_t>::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream<char> (0x0x7f3d6988e7b8 instance) in std::basic_iostream<char> +std::basic_iostream<char>::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream<char> (0x0x7f3d6988e888 instance) in std::basic_iostream<char> +std::basic_iostream<char>::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +VTT for std::basic_iostream<char> +std::basic_iostream<char>::_ZTTSd: 7u entries +0 ((& std::basic_iostream<char>::_ZTVSd) + 24u) +8 ((& std::basic_iostream<char>::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream<char>::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream<char>::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream<char>::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream<char>::_ZTVSd) + 104u) +48 ((& std::basic_iostream<char>::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream<wchar_t> (0x0x7f3d6988ec30 instance) in std::basic_iostream<wchar_t> +std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream<wchar_t> (0x0x7f3d6988ed00 instance) in std::basic_iostream<wchar_t> +std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +VTT for std::basic_iostream<wchar_t> +std::basic_iostream<wchar_t>::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream<wchar_t>::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream<wchar_t>::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream<wchar_t>::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f3d69825660) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f3d698256c0) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f3d69600a20) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f3d69600d80) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7f3d696f6240) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f3d693930c0) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f3d69393720) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f3d693936c0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f3d6915a7e0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f3d692f2420) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7f3d690f2060) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7f3d690f20c0) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f3d690f2120) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7f3d690f24e0) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7f3d690f2540) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7f3d690b46e8) 0 empty + QListData::NotIndirectLayout (0x0x7f3d690f25a0) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7f3d68da5620) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f3d690f2600) 0 empty + QListData::NotIndirectLayout (0x0x7f3d690f2660) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7f3d690b4750) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f3d690f26c0) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f3d690f2720) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f3d690f2480) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f3d690f2ba0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f3d68b3ede0) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f3d68b3ed80) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f3d68b5f1a0) 0 + QList<QString> (0x0x7f3d68b5f208) 0 + QListSpecialMethods<QString> (0x0x7f3d68b9d000) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f3d68b9d420) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f3d68b9df00) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7f3d68c935a0) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7f3d68c93720) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7f3d68c937e0) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7f3d68b5faf8) 0 + std::__uses_alloc_base (0x0x7f3d68c93780) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7f3d68abd840) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f3d68abda80) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f3d68abdb40) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f3d68abdc60) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f3d68abdde0) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f3d687f8240) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7f3d687f8360) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f3d687f8cc0) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f3d684ea120) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f3d684ea420) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7f3d6830fc60) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7f3d6847eae0) 0 empty + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7f3d6847eb40) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f3d6847ed20) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7f3d6847ecc0) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7f3d68183000) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f3d68183060) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f3d68183120) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7f3d6814fea0) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f3d681830c0) 0 + primary-for QAbstractAnimation (0x0x7f3d6814fea0) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f3d681831e0) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7f3d6814ff08) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f3d68183180) 0 + primary-for QAnimationDriver (0x0x7f3d6814ff08) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f3d681832a0) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7f3d6814ff70) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f3d68183240) 0 + primary-for QEventLoop (0x0x7f3d6814ff70) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f3d68183480) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f3d68183540) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f3d681835a0) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7f3d6814f2d8) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f3d681834e0) 0 + primary-for QAbstractEventDispatcher (0x0x7f3d6814f2d8) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7f3d68183840) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7f3d68221138) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7f3d681838a0) 0 nearly-empty + primary-for std::bad_cast (0x0x7f3d68221138) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7f3d682211a0) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7f3d68183900) 0 nearly-empty + primary-for std::bad_typeid (0x0x7f3d682211a0) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7f3d67f9a410) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7f3d67f4a9c0) 0 nearly-empty + primary-for std::bad_function_call (0x0x7f3d67f9a410) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7f3d67f4aa80) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7f3d67f4aae0) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7f3d67f4ac00) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f3d68012120) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f3d68012660) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f3d68012a20) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7f3d680129c0) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f3d68012a80) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f3d67d96360) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f3d67d96420) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f3d67d963c0) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f3d67d96480) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f3d67d96300) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f3d67b1df60) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f3d67bca600) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f3d67bca5a0) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f3d67bca6c0) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f3d67bca660) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f3d678eb9c0) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f3d67a2f0c0) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f3d67ab97e0) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7f3d67acc1a0) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f3d67ab9780) 0 + primary-for QAbstractItemModel (0x0x7f3d67acc1a0) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f3d67ab9b40) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7f3d67acc3a8) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f3d67acc410) 0 + primary-for QAbstractTableModel (0x0x7f3d67acc3a8) + QObject (0x0x7f3d67ab9ae0) 0 + primary-for QAbstractItemModel (0x0x7f3d67acc410) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f3d67ab9c00) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7f3d67acc478) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f3d67acc4e0) 0 + primary-for QAbstractListModel (0x0x7f3d67acc478) + QObject (0x0x7f3d67ab9ba0) 0 + primary-for QAbstractItemModel (0x0x7f3d67acc4e0) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f3d67ab9ea0) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f3d67ab9f60) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7f3d67acc618) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f3d67acc680) 0 + primary-for QAbstractProxyModel (0x0x7f3d67acc618) + QObject (0x0x7f3d67ab9f00) 0 + primary-for QAbstractItemModel (0x0x7f3d67acc680) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f3d677eb060) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7f3d67acc6e8) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f3d677eb000) 0 + primary-for QAbstractState (0x0x7f3d67acc6e8) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f3d677eb120) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7f3d67acc750) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f3d677eb0c0) 0 + primary-for QAbstractTransition (0x0x7f3d67acc750) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f3d677eb1e0) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7f3d67acc7b8) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f3d67acc820) 0 + primary-for QAnimationGroup (0x0x7f3d67acc7b8) + QObject (0x0x7f3d677eb180) 0 + primary-for QAbstractAnimation (0x0x7f3d67acc820) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f3d67837f00) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f3d6787b1e0) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f3d6787b2a0) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f3d6787b5a0) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7f3d67accea0) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f3d6787b540) 0 + primary-for QIODevice (0x0x7f3d67accea0) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f3d6787b7e0) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7f3d67521000) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f3d67521068) 0 + primary-for QBuffer (0x0x7f3d67521000) + QObject (0x0x7f3d6787b780) 0 + primary-for QIODevice (0x0x7f3d67521068) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f3d6787b8a0) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f3d6787b840) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7f3d6787b9c0) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7f3d6787b960) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f3d6787bba0) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f3d6787bd80) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f3d676583c0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f3d67658480) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f3d672de480) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7f3d672de900) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7f3d672e3548) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f3d672de960) 0 + primary-for QTimerEvent (0x0x7f3d672e3548) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7f3d672e35b0) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f3d672de9c0) 0 + primary-for QChildEvent (0x0x7f3d672e35b0) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7f3d672e3af8) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f3d672deea0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f3d672e3af8) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7f3d672e3b60) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f3d672def00) 0 + primary-for QDeferredDeleteEvent (0x0x7f3d672e3b60) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f3d67375000) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7f3d672e3bc8) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f3d672def60) 0 + primary-for QCoreApplication (0x0x7f3d672e3bc8) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f3d67375060) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f3d673750c0) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f3d673756c0) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f3d67375720) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7f3d673757e0) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f3d67375cc0) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f3d67375f60) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7f3d6709d720) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7f3d6709d780) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f3d6709d6c0) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f3d6714a8a0) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7f3d6714ad80) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7f3d6726fd20) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f3d66f17000) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f3d66f17240) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f3d66f173c0) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7f3d66f17900) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f3d66f178a0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f3d66d11de0) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f3d66d11ea0) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f3d66e0f060) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7f3d66df3d00) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f3d66df3d68) 0 + primary-for QFileDevice (0x0x7f3d66df3d00) + QObject (0x0x7f3d66e0f000) 0 + primary-for QIODevice (0x0x7f3d66df3d68) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f3d66e0f2a0) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7f3d66df3ea0) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f3d66df3f08) 0 + primary-for QFile (0x0x7f3d66df3ea0) + QIODevice (0x0x7f3d66df3f70) 0 + primary-for QFileDevice (0x0x7f3d66df3f08) + QObject (0x0x7f3d66e0f240) 0 + primary-for QIODevice (0x0x7f3d66df3f70) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f3d66e0f480) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f3d66e0f8a0) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f3d66b112a0) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f3d66b114e0) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f3d66c0f900) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7f3d66c08f70) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f3d66c5b000) 0 + primary-for QEventTransition (0x0x7f3d66c08f70) + QObject (0x0x7f3d66c0f8a0) 0 + primary-for QAbstractTransition (0x0x7f3d66c5b000) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7f3d66c5b068) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f3d66c0f960) 0 nearly-empty + primary-for QException (0x0x7f3d66c5b068) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7f3d66c5b0d0) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f3d66c5b138) 0 nearly-empty + primary-for QUnhandledException (0x0x7f3d66c5b0d0) + std::exception (0x0x7f3d66c0f9c0) 0 nearly-empty + primary-for QException (0x0x7f3d66c5b138) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f3d66c0fa20) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f3d66c0fae0) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f3d66c0fb40) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f3d66c0fc60) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7f3d66c5b1a0) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f3d66c0fc00) 0 + primary-for QFileSelector (0x0x7f3d66c5b1a0) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f3d66c0fd20) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7f3d66c5b208) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f3d66c0fcc0) 0 + primary-for QFileSystemWatcher (0x0x7f3d66c5b208) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f3d66c0fde0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7f3d66c5b270) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f3d66c5b2d8) 0 + primary-for QFinalState (0x0x7f3d66c5b270) + QObject (0x0x7f3d66c0fd80) 0 + primary-for QAbstractState (0x0x7f3d66c5b2d8) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f3d66c0fe40) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f3d66c0fea0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f3d66c5b410) 0 + QBasicMutex (0x0x7f3d668f10c0) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f3d668f1120) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f3d668f1180) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f3d668f11e0) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7f3d668f1300) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7f3d668f1b40) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f3d66a25360) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0u +48 0u +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7f3d669d4548) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f3d66a25300) 0 + primary-for QFutureWatcherBase (0x0x7f3d669d4548) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f3d66a25960) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7f3d669d4e38) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f3d669d4ea0) 0 + primary-for QHistoryState (0x0x7f3d669d4e38) + QObject (0x0x7f3d66a25900) 0 + primary-for QAbstractState (0x0x7f3d669d4ea0) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f3d66a25a20) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7f3d669d4f08) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f3d669d4f70) 0 + primary-for QIdentityProxyModel (0x0x7f3d669d4f08) + QAbstractItemModel (0x0x7f3d6669c000) 0 + primary-for QAbstractProxyModel (0x0x7f3d669d4f70) + QObject (0x0x7f3d66a259c0) 0 + primary-for QAbstractItemModel (0x0x7f3d6669c000) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f3d66a25a80) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f3d666ff180) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7f3d6669c820) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f3d666ff120) 0 + primary-for QItemSelectionModel (0x0x7f3d6669c820) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f3d6669ca28) 0 + QList<QItemSelectionRange> (0x0x7f3d6669ca90) 0 + QListSpecialMethods<QItemSelectionRange> (0x0x7f3d666ff480) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f3d666ff960) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f3d664fe0c0) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7f3d664fe600) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7f3d664fe660) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f3d664fe840) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f3d664fe8a0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f3d664fe7e0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f3d66609ae0) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f3d66609b40) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f3d6667f1e0) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f3d6667f240) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f3d6667f180) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f3d663164e0) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7f3d6630add0) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f3d66316480) 0 + primary-for QLibrary (0x0x7f3d6630add0) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7f3d66316ba0) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7f3d663166c0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f3d6640b0c0) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f3d6640b120) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f3d6640b3c0) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f3d6640b660) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f3d660cb000) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7f3d660cb960) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f3d660cbcc0) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7f3d660cbe40) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f3d660cbde0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f3d6621d000) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f3d6621d2a0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f3d6621d900) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f3d6621d960) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f3d6621df60) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f3d65f0c2a0) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f3d65f0c300) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f3d65f0c600) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7f3d65f26068) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f3d65f0c5a0) 0 + primary-for QMimeData (0x0x7f3d65f26068) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f3d65f0c660) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f3d65f0c960) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f3d65f0ca20) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7f3d65f26270) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f3d65f0c9c0) 0 + primary-for QObjectCleanupHandler (0x0x7f3d65f26270) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7f3d65f0ca80) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f3d65f9c240) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7f3d65f269c0) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f3d65f26a28) 0 + primary-for QParallelAnimationGroup (0x0x7f3d65f269c0) + QAbstractAnimation (0x0x7f3d65f26a90) 0 + primary-for QAnimationGroup (0x0x7f3d65f26a28) + QObject (0x0x7f3d65f9c1e0) 0 + primary-for QAbstractAnimation (0x0x7f3d65f26a90) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f3d65f9c300) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7f3d65f26af8) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f3d65f26b60) 0 + primary-for QPauseAnimation (0x0x7f3d65f26af8) + QObject (0x0x7f3d65f9c2a0) 0 + primary-for QAbstractAnimation (0x0x7f3d65f26b60) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f3d65f9c4e0) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f3d65f9c7e0) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7f3d65f26d68) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f3d65f9c780) 0 + primary-for QPluginLoader (0x0x7f3d65f26d68) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f3d65f9c840) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f3d65f9cf00) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7f3d660063a8) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f3d66006410) 0 + primary-for QProcess (0x0x7f3d660063a8) + QObject (0x0x7f3d65f9cea0) 0 + primary-for QIODevice (0x0x7f3d66006410) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f3d66049000) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7f3d66006478) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f3d660064e0) 0 + primary-for QVariantAnimation (0x0x7f3d66006478) + QObject (0x0x7f3d65f9cf60) 0 + primary-for QAbstractAnimation (0x0x7f3d660064e0) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f3d660490c0) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7f3d660065b0) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f3d66006618) 0 + primary-for QPropertyAnimation (0x0x7f3d660065b0) + QAbstractAnimation (0x0x7f3d66006680) 0 + primary-for QVariantAnimation (0x0x7f3d66006618) + QObject (0x0x7f3d66049060) 0 + primary-for QAbstractAnimation (0x0x7f3d66006680) + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7f3d660491e0) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7f3d66049180) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7f3d65ce7958) 0 + QRandomGenerator (0x0x7f3d65cff180) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f3d65cff240) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f3d65cff4e0) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f3d65cff5a0) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f3d65cff660) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f3d65cff900) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f3d65cffba0) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f3d65cffe40) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f3d65af2120) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f3d65af2720) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f3d65af2a20) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f3d65af2d20) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f3d65af2ea0) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7f3d65e2fb60) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f3d65e2fbc8) 0 + primary-for QSaveFile (0x0x7f3d65e2fb60) + QIODevice (0x0x7f3d65e2fc30) 0 + primary-for QFileDevice (0x0x7f3d65e2fbc8) + QObject (0x0x7f3d65af2e40) 0 + primary-for QIODevice (0x0x7f3d65e2fc30) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f3d65af2f60) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7f3d65c38000) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f3d65919600) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7f3d65923478) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f3d659234e0) 0 + primary-for QSequentialAnimationGroup (0x0x7f3d65923478) + QAbstractAnimation (0x0x7f3d65923548) 0 + primary-for QAnimationGroup (0x0x7f3d659234e0) + QObject (0x0x7f3d659195a0) 0 + primary-for QAbstractAnimation (0x0x7f3d65923548) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f3d659196c0) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7f3d659235b0) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f3d65919660) 0 + primary-for QSettings (0x0x7f3d659235b0) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f3d65919780) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7f3d65923618) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f3d65919720) 0 + primary-for QSharedMemory (0x0x7f3d65923618) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f3d65919840) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7f3d65923680) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f3d659197e0) 0 + primary-for QSignalMapper (0x0x7f3d65923680) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f3d65919900) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7f3d659236e8) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f3d65923750) 0 + primary-for QSignalTransition (0x0x7f3d659236e8) + QObject (0x0x7f3d659198a0) 0 + primary-for QAbstractTransition (0x0x7f3d65923750) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f3d659199c0) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7f3d659237b8) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f3d65919960) 0 + primary-for QSocketNotifier (0x0x7f3d659237b8) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f3d65919a80) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7f3d65923820) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f3d65923888) 0 + primary-for QSortFilterProxyModel (0x0x7f3d65923820) + QAbstractItemModel (0x0x7f3d659238f0) 0 + primary-for QAbstractProxyModel (0x0x7f3d65923888) + QObject (0x0x7f3d65919a20) 0 + primary-for QAbstractItemModel (0x0x7f3d659238f0) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f3d65919b40) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f3d65919d80) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7f3d65923a90) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f3d65923af8) 0 + primary-for QState (0x0x7f3d65923a90) + QObject (0x0x7f3d65919d20) 0 + primary-for QAbstractState (0x0x7f3d65923af8) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f3d65919ea0) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7f3d65923c98) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f3d65919f00) 0 + primary-for QStateMachine::SignalEvent (0x0x7f3d65923c98) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7f3d65923d00) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f3d65919f60) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f3d65923d00) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7f3d65923b60) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f3d65923bc8) 0 + primary-for QStateMachine (0x0x7f3d65923b60) + QAbstractState (0x0x7f3d65923c30) 0 + primary-for QState (0x0x7f3d65923bc8) + QObject (0x0x7f3d65919e40) 0 + primary-for QAbstractState (0x0x7f3d65923c30) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7f3d65a49000) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f3d65a49f00) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f3d656a3a20) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7f3d65701208) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f3d65701270) 0 + primary-for QStringListModel (0x0x7f3d65701208) + QAbstractItemModel (0x0x7f3d657012d8) 0 + primary-for QAbstractListModel (0x0x7f3d65701270) + QObject (0x0x7f3d656a39c0) 0 + primary-for QAbstractItemModel (0x0x7f3d657012d8) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f3d656a3a80) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f3d656a3b40) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f3d656a3c60) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7f3d65701340) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f3d657013a8) 0 + primary-for QTemporaryFile (0x0x7f3d65701340) + QFileDevice (0x0x7f3d65701410) 0 + primary-for QFile (0x0x7f3d657013a8) + QIODevice (0x0x7f3d65701478) 0 + primary-for QFileDevice (0x0x7f3d65701410) + QObject (0x0x7f3d656a3c00) 0 + primary-for QIODevice (0x0x7f3d65701478) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f3d656a3cc0) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f3d656a3f00) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f3d656a3ea0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f3d6579a120) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f3d6579a180) 0 + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7f3d6579a1e0) 0 + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7f3d6579a240) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7f3d65701680) 0 + std::__mutex_base (0x0x7f3d6579a2a0) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7f3d657016e8) 0 + std::__recursive_mutex_base (0x0x7f3d6579a300) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7f3d65801460) 0 + std::__mutex_base (0x0x7f3d6579a420) 0 + std::__timed_mutex_impl<std::timed_mutex> (0x0x7f3d6579a480) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7f3d658160e0) 0 + std::__recursive_mutex_base (0x0x7f3d6579a540) 0 + std::__timed_mutex_impl<std::recursive_timed_mutex> (0x0x7f3d6579a5a0) 0 empty + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7f3d6579a600) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7f3d6579a660) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7f3d6579a6c0) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7f3d6579a900) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7f3d65701820) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16u) + std::exception (0x0x7f3d6579a9c0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7f3d65701820) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7f3d65701888) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16u) + std::exception (0x0x7f3d6579aa80) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7f3d65701888) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7f3d657018f0) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16u) + std::exception (0x0x7f3d6579ab40) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7f3d657018f0) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7f3d657019c0) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16u) + std::exception (0x0x7f3d6579ac00) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7f3d657019c0) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7f3d6579acc0) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7f3d6579ad20) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7f3d6579ad80) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7f3d6579ade0) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7f3d65701c98) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16u) + std::exception (0x0x7f3d654e5180) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7f3d65701c98) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7f3d654e59c0) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7f3d651871e0) 0 + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7f3d651873c0) 0 + +Vtable for std::thread::_Impl_base +std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread10_Impl_baseE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_Impl_base + size=24 align=8 + base size=24 base align=8 +std::thread::_Impl_base (0x0x7f3d65187420) 0 + vptr=((& std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE) + 16u) + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7f3d65187360) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7f3d65346060) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7f3d65346120) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7f3d65346180) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7f3d64ffa7e0) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7f3d6504b000) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16u) + std::logic_error (0x0x7f3d6504b068) 0 + primary-for std::future_error (0x0x7f3d6504b000) + std::exception (0x0x7f3d64ffa900) 0 nearly-empty + primary-for std::logic_error (0x0x7f3d6504b068) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7f3d64ffaa20) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7f3d64ffa9c0) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16u) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7f3d65090f60) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7f3d64d56618) 0 + std::__at_thread_exit_elt (0x0x7f3d64d7a060) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7f3d64ffaba0) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16u) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7f3d64ffa960) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7f3d64aed208) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16u) + std::__future_base::_State_baseV2 (0x0x7f3d64a99f00) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7f3d64aed208) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f3d64afe660) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7f3d64aedc98) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f3d64afe600) 0 + primary-for QThread (0x0x7f3d64aedc98) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f3d64afe780) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7f3d64aedd00) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f3d64afe720) 0 + primary-for QThreadPool (0x0x7f3d64aedd00) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f3d64afe7e0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f3d64afe900) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7f3d64aedd68) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f3d64afe8a0) 0 + primary-for QTimeLine (0x0x7f3d64aedd68) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f3d64afe9c0) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7f3d64aeddd0) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f3d64afe960) 0 + primary-for QTimer (0x0x7f3d64aeddd0) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f3d647c50c0) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f3d647c5060) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f3d647c5660) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7f3d647b7820) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f3d647c5600) 0 + primary-for QTranslator (0x0x7f3d647b7820) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f3d647c5780) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f3d648f9e40) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f3d6459c4e0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f3d6459cae0) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f3d6459cb40) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f3d6459ce40) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f3d646272d8) 0 + QVector<QXmlStreamAttribute> (0x0x7f3d64644240) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f3d646442a0) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f3d64644540) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f3d646447e0) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7f3d64644a80) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f3d64644ae0) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f3d64718540) 0 + +Class QSerialPort::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSerialPort::QPrivateSignal (0x0x7f3d647186c0) 0 empty + +Vtable for QSerialPort +QSerialPort::_ZTV11QSerialPort: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QSerialPort) +16 (int (*)(...))QSerialPort::metaObject +24 (int (*)(...))QSerialPort::qt_metacast +32 (int (*)(...))QSerialPort::qt_metacall +40 (int (*)(...))QSerialPort::~QSerialPort +48 (int (*)(...))QSerialPort::~QSerialPort +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSerialPort::isSequential +120 (int (*)(...))QSerialPort::open +128 (int (*)(...))QSerialPort::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QSerialPort::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QSerialPort::bytesAvailable +184 (int (*)(...))QSerialPort::bytesToWrite +192 (int (*)(...))QSerialPort::canReadLine +200 (int (*)(...))QSerialPort::waitForReadyRead +208 (int (*)(...))QSerialPort::waitForBytesWritten +216 (int (*)(...))QSerialPort::readData +224 (int (*)(...))QSerialPort::readLineData +232 (int (*)(...))QSerialPort::writeData + +Class QSerialPort + size=24 align=8 + base size=24 base align=8 +QSerialPort (0x0x7f3d6473f410) 0 + vptr=((& QSerialPort::_ZTV11QSerialPort) + 16u) + QIODevice (0x0x7f3d6473f478) 0 + primary-for QSerialPort (0x0x7f3d6473f410) + QObject (0x0x7f3d64718660) 0 + primary-for QIODevice (0x0x7f3d6473f478) + +Class QSerialPortInfo + size=8 align=8 + base size=8 base align=8 +QSerialPortInfo (0x0x7f3d64718a20) 0 + |