diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-10-06 09:32:30 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-10-12 07:40:50 +0000 |
commit | 1fe29cf3a453c65cb7c62bd5422d0a0e13dcf25f (patch) | |
tree | c8ed5640facbfa479d9f7a2a9b7ee728ca61b8e3 | |
parent | 3bb580340262c4db65286aaad4dd37b4f56eb651 (diff) |
Polish the modbus client example
- Use modern string literals
- Use QCommandLineParser to switch on verbose mode
- Fix translated texts with arguments
- Streamline some code
- Remove unused member variable
- Use QVariant casts
Change-Id: Ie3bdaa82856bfe8df020dc289de9177d098f02d3
Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
(cherry picked from commit 101295aef757747490fb5533710d9e10bf303d19)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | examples/serialbus/modbus/client/main.cpp | 18 | ||||
-rw-r--r-- | examples/serialbus/modbus/client/mainwindow.cpp | 60 | ||||
-rw-r--r-- | examples/serialbus/modbus/client/mainwindow.h | 3 | ||||
-rw-r--r-- | examples/serialbus/modbus/client/writeregistermodel.cpp | 62 |
4 files changed, 84 insertions, 59 deletions
diff --git a/examples/serialbus/modbus/client/main.cpp b/examples/serialbus/modbus/client/main.cpp index 6e222ee..cbcf720 100644 --- a/examples/serialbus/modbus/client/main.cpp +++ b/examples/serialbus/modbus/client/main.cpp @@ -4,13 +4,27 @@ #include "mainwindow.h" #include <QApplication> +#include <QCommandLineParser> +#include <QCommandLineOption> #include <QLoggingCategory> +using namespace Qt::StringLiterals; + int main(int argc, char *argv[]) { - // Uncomment the following line to enable logging - // QLoggingCategory::setFilterRules(QStringLiteral("qt.modbus* = true")); QApplication a(argc, argv); + + QCommandLineParser parser; + parser.setApplicationDescription(u"Modbus Client Example"_s); + parser.addHelpOption(); + parser.addVersionOption(); + QCommandLineOption verboseOption(u"verbose"_s, u"Verbose mode"_s); + parser.addOption(verboseOption); + parser.process(a); + + if (parser.isSet(verboseOption)) + QLoggingCategory::setFilterRules(u"qt.modbus* = true"_s); + MainWindow w; w.show(); diff --git a/examples/serialbus/modbus/client/mainwindow.cpp b/examples/serialbus/modbus/client/mainwindow.cpp index 7528f34..d505513 100644 --- a/examples/serialbus/modbus/client/mainwindow.cpp +++ b/examples/serialbus/modbus/client/mainwindow.cpp @@ -12,6 +12,8 @@ #include <QStatusBar> #include <QUrl> +using namespace Qt::StringLiterals; + enum ModbusConnection { Serial, Tcp @@ -51,11 +53,11 @@ MainWindow::MainWindow(QWidget *parent) ui->connectType->setEnabled(false); #endif - auto model = new QStandardItemModel(10, 1, this); - for (int i = 0; i < 10; ++i) - model->setItem(i, new QStandardItem(QStringLiteral("%1").arg(i + 1))); + auto *model = new QStandardItemModel(0, 1, this); + for (int i = 1; i <= 10; ++i) + model->appendRow(new QStandardItem(QString::number(i))); ui->writeSize->setModel(model); - ui->writeSize->setCurrentText("10"); + ui->writeSize->setCurrentText(u"10"_s); connect(ui->writeSize, &QComboBox::currentTextChanged, writeModel, &WriteRegisterModel::setNumberOfValues); @@ -152,28 +154,29 @@ void MainWindow::onConnectButtonClicked() statusBar()->clearMessage(); if (modbusDevice->state() != QModbusDevice::ConnectedState) { + const auto settings = m_settingsDialog->settings(); if (static_cast<ModbusConnection>(ui->connectType->currentIndex()) == Serial) { modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, ui->portEdit->text()); #if QT_CONFIG(modbus_serialport) modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, - m_settingsDialog->settings().parity); + settings.parity); modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, - m_settingsDialog->settings().baud); + settings.baud); modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, - m_settingsDialog->settings().dataBits); + settings.dataBits); modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, - m_settingsDialog->settings().stopBits); + settings.stopBits); #endif } else { const QUrl url = QUrl::fromUserInput(ui->portEdit->text()); modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, url.port()); modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, url.host()); } - modbusDevice->setTimeout(m_settingsDialog->settings().responseTime); - modbusDevice->setNumberOfRetries(m_settingsDialog->settings().numberOfRetries); + modbusDevice->setTimeout(settings.responseTime); + modbusDevice->setNumberOfRetries(settings.numberOfRetries); if (!modbusDevice->connectDevice()) { - statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000); + statusBar()->showMessage(tr("Connect failed: %1").arg(modbusDevice->errorString()), 5000); } else { ui->actionConnect->setEnabled(false); ui->actionDisconnect->setEnabled(true); @@ -210,7 +213,7 @@ void MainWindow::onReadButtonClicked() else delete reply; // broadcast replies return immediately } else { - statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000); + statusBar()->showMessage(tr("Read error: %1").arg(modbusDevice->errorString()), 5000); } } @@ -250,22 +253,24 @@ void MainWindow::onWriteButtonClicked() QModbusDataUnit writeUnit = writeRequest(); QModbusDataUnit::RegisterType table = writeUnit.registerType(); for (qsizetype i = 0, total = writeUnit.valueCount(); i < total; ++i) { + const auto addr = i + writeUnit.startAddress(); if (table == QModbusDataUnit::Coils) - writeUnit.setValue(i, writeModel->m_coils[i + writeUnit.startAddress()]); + writeUnit.setValue(i, writeModel->m_coils[addr]); else - writeUnit.setValue(i, writeModel->m_holdingRegisters[i + writeUnit.startAddress()]); + writeUnit.setValue(i, writeModel->m_holdingRegisters[addr]); } if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, ui->serverEdit->value())) { if (!reply->isFinished()) { connect(reply, &QModbusReply::finished, this, [this, reply]() { - if (reply->error() == QModbusDevice::ProtocolError) { + const auto error = reply->error(); + if (error == QModbusDevice::ProtocolError) { statusBar()->showMessage(tr("Write response error: %1 (Modbus exception: 0x%2)") .arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16), 5000); - } else if (reply->error() != QModbusDevice::NoError) { + } else if (error != QModbusDevice::NoError) { statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)"). - arg(reply->errorString()).arg(reply->error(), -1, 16), 5000); + arg(reply->errorString()).arg(error, -1, 16), 5000); } reply->deleteLater(); }); @@ -274,7 +279,7 @@ void MainWindow::onWriteButtonClicked() reply->deleteLater(); } } else { - statusBar()->showMessage(tr("Write error: ") + modbusDevice->errorString(), 5000); + statusBar()->showMessage(tr("Write error: %1").arg(modbusDevice->errorString()), 5000); } } @@ -288,10 +293,11 @@ void MainWindow::onReadWriteButtonClicked() QModbusDataUnit writeUnit = writeRequest(); QModbusDataUnit::RegisterType table = writeUnit.registerType(); for (qsizetype i = 0, total = writeUnit.valueCount(); i < total; ++i) { + const auto addr = i + writeUnit.startAddress(); if (table == QModbusDataUnit::Coils) - writeUnit.setValue(i, writeModel->m_coils[i + writeUnit.startAddress()]); + writeUnit.setValue(i, writeModel->m_coils[addr]); else - writeUnit.setValue(i, writeModel->m_holdingRegisters[i + writeUnit.startAddress()]); + writeUnit.setValue(i, writeModel->m_holdingRegisters[addr]); } if (auto *reply = modbusDevice->sendReadWriteRequest(readRequest(), writeUnit, @@ -301,7 +307,7 @@ void MainWindow::onReadWriteButtonClicked() else delete reply; // broadcast replies return immediately } else { - statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000); + statusBar()->showMessage(tr("Read error: %1").arg(modbusDevice->errorString()), 5000); } } @@ -321,26 +327,26 @@ void MainWindow::onWriteTableChanged(int index) QModbusDataUnit MainWindow::readRequest() const { - const auto table = - static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt()); + const auto table = ui->writeTable->currentData().value<QModbusDataUnit::RegisterType>(); int startAddress = ui->readAddress->value(); Q_ASSERT(startAddress >= 0 && startAddress < 10); // do not go beyond 10 entries - quint16 numberOfEntries = qMin(ui->readSize->currentText().toUShort(), quint16(10 - startAddress)); + quint16 numberOfEntries = qMin(ui->readSize->currentText().toUShort(), + quint16(10 - startAddress)); return QModbusDataUnit(table, startAddress, numberOfEntries); } QModbusDataUnit MainWindow::writeRequest() const { - const auto table = - static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt()); + const auto table = ui->writeTable->currentData().value<QModbusDataUnit::RegisterType>(); int startAddress = ui->writeAddress->value(); Q_ASSERT(startAddress >= 0 && startAddress < 10); // do not go beyond 10 entries - quint16 numberOfEntries = qMin(ui->writeSize->currentText().toUShort(), quint16(10 - startAddress)); + quint16 numberOfEntries = qMin(ui->writeSize->currentText().toUShort(), + quint16(10 - startAddress)); return QModbusDataUnit(table, startAddress, numberOfEntries); } diff --git a/examples/serialbus/modbus/client/mainwindow.h b/examples/serialbus/modbus/client/mainwindow.h index f2ab08c..57d6e61 100644 --- a/examples/serialbus/modbus/client/mainwindow.h +++ b/examples/serialbus/modbus/client/mainwindow.h @@ -10,11 +10,9 @@ QT_BEGIN_NAMESPACE class QModbusClient; -class QModbusReply; namespace Ui { class MainWindow; -class SettingsDialog; } QT_END_NAMESPACE @@ -50,7 +48,6 @@ private slots: private: Ui::MainWindow *ui = nullptr; - QModbusReply *lastRequest = nullptr; QModbusClient *modbusDevice = nullptr; SettingsDialog *m_settingsDialog = nullptr; WriteRegisterModel *writeModel = nullptr; diff --git a/examples/serialbus/modbus/client/writeregistermodel.cpp b/examples/serialbus/modbus/client/writeregistermodel.cpp index 6cc62a5..de6ffbd 100644 --- a/examples/serialbus/modbus/client/writeregistermodel.cpp +++ b/examples/serialbus/modbus/client/writeregistermodel.cpp @@ -3,6 +3,8 @@ #include "writeregistermodel.h" +using namespace Qt::StringLiterals; + enum { NumColumn = 0, CoilsColumn = 1, HoldingColumn = 2, ColumnCount = 3, RowCount = 10 }; WriteRegisterModel::WriteRegisterModel(QObject *parent) @@ -11,77 +13,81 @@ WriteRegisterModel::WriteRegisterModel(QObject *parent) { } -int WriteRegisterModel::rowCount(const QModelIndex &/*parent*/) const +int WriteRegisterModel::rowCount(const QModelIndex & /* parent */) const { return RowCount; } -int WriteRegisterModel::columnCount(const QModelIndex &/*parent*/) const +int WriteRegisterModel::columnCount(const QModelIndex & /* parent */) const { return ColumnCount; } QVariant WriteRegisterModel::data(const QModelIndex &index, int role) const { - if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount) - return QVariant(); + const int row = index.row(); + const int column = index.column(); + if (!index.isValid() || row >= RowCount || column >= ColumnCount) + return {}; Q_ASSERT(m_coils.count() == RowCount); Q_ASSERT(m_holdingRegisters.count() == RowCount); - if (index.column() == NumColumn && role == Qt::DisplayRole) - return QString::number(index.row()); + if (column == NumColumn && role == Qt::DisplayRole) + return QString::number(row); - if (index.column() == CoilsColumn && role == Qt::CheckStateRole) // coils - return m_coils.at(index.row()) ? Qt::Checked : Qt::Unchecked; + if (column == CoilsColumn && role == Qt::CheckStateRole) // coils + return m_coils.at(row) ? Qt::Checked : Qt::Unchecked; - if (index.column() == HoldingColumn && role == Qt::DisplayRole) // holding registers - return QString("0x%1").arg(QString::number(m_holdingRegisters.at(index.row()), 16)); + if (column == HoldingColumn && role == Qt::DisplayRole) // holding registers + return QString("0x%1").arg(QString::number(m_holdingRegisters.at(row), 16)); - return QVariant(); + return {}; } QVariant WriteRegisterModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) - return QVariant(); + return {}; if (orientation == Qt::Horizontal) { switch (section) { case NumColumn: - return QStringLiteral("#"); + return u"#"_s; case CoilsColumn: - return QStringLiteral("Coils "); + return u"Coils "_s; case HoldingColumn: - return QStringLiteral("Holding Registers"); + return u"Holding Registers"_s; default: break; } } - return QVariant(); + return {}; } bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value, int role) { - if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount) + const int row = index.row(); + const int column = index.column(); + if (!index.isValid() || row >= RowCount || column >= ColumnCount) return false; Q_ASSERT(m_coils.count() == RowCount); Q_ASSERT(m_holdingRegisters.count() == RowCount); - if (index.column() == CoilsColumn && role == Qt::CheckStateRole) { // coils + if (column == CoilsColumn && role == Qt::CheckStateRole) { // coils auto s = static_cast<Qt::CheckState>(value.toUInt()); - s == Qt::Checked ? m_coils.setBit(index.row()) : m_coils.clearBit(index.row()); + s == Qt::Checked ? m_coils.setBit(row) : m_coils.clearBit(row); emit dataChanged(index, index); return true; } - if (index.column() == HoldingColumn && role == Qt::EditRole) { // holding registers + if (column == HoldingColumn && role == Qt::EditRole) { // holding registers bool result = false; quint16 newValue = value.toString().toUShort(&result, 16); if (result) - m_holdingRegisters[index.row()] = newValue; + m_holdingRegisters[row] = newValue; emit dataChanged(index, index); return result; @@ -92,16 +98,18 @@ bool WriteRegisterModel::setData(const QModelIndex &index, const QVariant &value Qt::ItemFlags WriteRegisterModel::flags(const QModelIndex &index) const { - if (!index.isValid() || index.row() >= RowCount || index.column() >= ColumnCount) - return QAbstractTableModel::flags(index); - + const int row = index.row(); + const int column = index.column(); Qt::ItemFlags flags = QAbstractTableModel::flags(index); - if ((index.row() < m_address) || (index.row() >= (m_address + m_number))) + if (!index.isValid() || row >= RowCount || column >= ColumnCount) + return flags; + + if ((row < m_address) || (row >= (m_address + m_number))) flags &= ~Qt::ItemIsEnabled; - if (index.column() == CoilsColumn) // coils + if (column == CoilsColumn) // coils return flags | Qt::ItemIsUserCheckable; - if (index.column() == HoldingColumn) // holding registers + if (column == HoldingColumn) // holding registers return flags | Qt::ItemIsEditable; return flags; |