summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-10-06 09:32:30 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-10-12 07:40:50 +0000
commit1fe29cf3a453c65cb7c62bd5422d0a0e13dcf25f (patch)
treec8ed5640facbfa479d9f7a2a9b7ee728ca61b8e3
parent3bb580340262c4db65286aaad4dd37b4f56eb651 (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.cpp18
-rw-r--r--examples/serialbus/modbus/client/mainwindow.cpp60
-rw-r--r--examples/serialbus/modbus/client/mainwindow.h3
-rw-r--r--examples/serialbus/modbus/client/writeregistermodel.cpp62
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;