71cd3bc074
One of the examples were using a different version than the others. Though QString's formatting probably didn't change since then so it was no problem. Anyway, pretend like we're releasing it now for the first time and set 6.5 on all of them Task-number: QTBUG-108875 Pick-to: 6.5 Change-Id: I28b496ab3d8ff54c503a032ba15882cdf3d5eccf Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
178 lines
6.1 KiB
C++
178 lines
6.1 KiB
C++
// Copyright (C) 2017 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
#include <QtWidgets>
|
|
#include <QtNetwork>
|
|
|
|
#include "client.h"
|
|
|
|
//! [0]
|
|
Client::Client(QWidget *parent)
|
|
: QDialog(parent)
|
|
, hostCombo(new QComboBox)
|
|
, portLineEdit(new QLineEdit)
|
|
, getFortuneButton(new QPushButton(tr("Get Fortune")))
|
|
, tcpSocket(new QTcpSocket(this))
|
|
{
|
|
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
|
//! [0]
|
|
hostCombo->setEditable(true);
|
|
// find out name of this machine
|
|
QString name = QHostInfo::localHostName();
|
|
if (!name.isEmpty()) {
|
|
hostCombo->addItem(name);
|
|
QString domain = QHostInfo::localDomainName();
|
|
if (!domain.isEmpty())
|
|
hostCombo->addItem(name + QChar('.') + domain);
|
|
}
|
|
if (name != QLatin1String("localhost"))
|
|
hostCombo->addItem(QString("localhost"));
|
|
// find out IP addresses of this machine
|
|
const QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
|
|
// add non-localhost addresses
|
|
for (const QHostAddress &entry : ipAddressesList) {
|
|
if (!entry.isLoopback())
|
|
hostCombo->addItem(entry.toString());
|
|
}
|
|
// add localhost addresses
|
|
for (const QHostAddress &entry : ipAddressesList) {
|
|
if (entry.isLoopback())
|
|
hostCombo->addItem(entry.toString());
|
|
}
|
|
|
|
portLineEdit->setValidator(new QIntValidator(1, 65535, this));
|
|
|
|
auto hostLabel = new QLabel(tr("&Server name:"));
|
|
hostLabel->setBuddy(hostCombo);
|
|
auto portLabel = new QLabel(tr("S&erver port:"));
|
|
portLabel->setBuddy(portLineEdit);
|
|
|
|
statusLabel = new QLabel(tr("This examples requires that you run the "
|
|
"Fortune Server example as well."));
|
|
|
|
getFortuneButton->setDefault(true);
|
|
getFortuneButton->setEnabled(false);
|
|
|
|
auto quitButton = new QPushButton(tr("Quit"));
|
|
|
|
auto buttonBox = new QDialogButtonBox;
|
|
buttonBox->addButton(getFortuneButton, QDialogButtonBox::ActionRole);
|
|
buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
|
|
|
|
//! [1]
|
|
in.setDevice(tcpSocket);
|
|
in.setVersion(QDataStream::Qt_6_5);
|
|
//! [1]
|
|
|
|
connect(hostCombo, &QComboBox::editTextChanged,
|
|
this, &Client::enableGetFortuneButton);
|
|
connect(portLineEdit, &QLineEdit::textChanged,
|
|
this, &Client::enableGetFortuneButton);
|
|
connect(getFortuneButton, &QAbstractButton::clicked,
|
|
this, &Client::requestNewFortune);
|
|
connect(quitButton, &QAbstractButton::clicked, this, &QWidget::close);
|
|
//! [2] //! [3]
|
|
connect(tcpSocket, &QIODevice::readyRead, this, &Client::readFortune);
|
|
//! [2] //! [4]
|
|
connect(tcpSocket, &QAbstractSocket::errorOccurred,
|
|
//! [3]
|
|
this, &Client::displayError);
|
|
//! [4]
|
|
|
|
QGridLayout *mainLayout = nullptr;
|
|
if (QGuiApplication::styleHints()->showIsFullScreen() || QGuiApplication::styleHints()->showIsMaximized()) {
|
|
auto outerVerticalLayout = new QVBoxLayout(this);
|
|
outerVerticalLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding));
|
|
auto outerHorizontalLayout = new QHBoxLayout;
|
|
outerHorizontalLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Ignored));
|
|
auto groupBox = new QGroupBox(QGuiApplication::applicationDisplayName());
|
|
mainLayout = new QGridLayout(groupBox);
|
|
outerHorizontalLayout->addWidget(groupBox);
|
|
outerHorizontalLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Ignored));
|
|
outerVerticalLayout->addLayout(outerHorizontalLayout);
|
|
outerVerticalLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Ignored, QSizePolicy::MinimumExpanding));
|
|
} else {
|
|
mainLayout = new QGridLayout(this);
|
|
}
|
|
mainLayout->addWidget(hostLabel, 0, 0);
|
|
mainLayout->addWidget(hostCombo, 0, 1);
|
|
mainLayout->addWidget(portLabel, 1, 0);
|
|
mainLayout->addWidget(portLineEdit, 1, 1);
|
|
mainLayout->addWidget(statusLabel, 2, 0, 1, 2);
|
|
mainLayout->addWidget(buttonBox, 3, 0, 1, 2);
|
|
|
|
setWindowTitle(QGuiApplication::applicationDisplayName());
|
|
portLineEdit->setFocus();
|
|
//! [5]
|
|
}
|
|
//! [5]
|
|
|
|
//! [6]
|
|
void Client::requestNewFortune()
|
|
{
|
|
getFortuneButton->setEnabled(false);
|
|
tcpSocket->abort();
|
|
//! [7]
|
|
tcpSocket->connectToHost(hostCombo->currentText(),
|
|
portLineEdit->text().toInt());
|
|
//! [7]
|
|
}
|
|
//! [6]
|
|
|
|
//! [8]
|
|
void Client::readFortune()
|
|
{
|
|
in.startTransaction();
|
|
|
|
QString nextFortune;
|
|
in >> nextFortune;
|
|
|
|
if (!in.commitTransaction())
|
|
return;
|
|
|
|
if (nextFortune == currentFortune) {
|
|
QTimer::singleShot(0, this, &Client::requestNewFortune);
|
|
return;
|
|
}
|
|
|
|
currentFortune = nextFortune;
|
|
statusLabel->setText(currentFortune);
|
|
getFortuneButton->setEnabled(true);
|
|
}
|
|
//! [8]
|
|
|
|
//! [13]
|
|
void Client::displayError(QAbstractSocket::SocketError socketError)
|
|
{
|
|
switch (socketError) {
|
|
case QAbstractSocket::RemoteHostClosedError:
|
|
break;
|
|
case QAbstractSocket::HostNotFoundError:
|
|
QMessageBox::information(this, tr("Fortune Client"),
|
|
tr("The host was not found. Please check the "
|
|
"host name and port settings."));
|
|
break;
|
|
case QAbstractSocket::ConnectionRefusedError:
|
|
QMessageBox::information(this, tr("Fortune Client"),
|
|
tr("The connection was refused by the peer. "
|
|
"Make sure the fortune server is running, "
|
|
"and check that the host name and port "
|
|
"settings are correct."));
|
|
break;
|
|
default:
|
|
QMessageBox::information(this, tr("Fortune Client"),
|
|
tr("The following error occurred: %1.")
|
|
.arg(tcpSocket->errorString()));
|
|
}
|
|
|
|
getFortuneButton->setEnabled(true);
|
|
}
|
|
//! [13]
|
|
|
|
void Client::enableGetFortuneButton()
|
|
{
|
|
getFortuneButton->setEnabled(!hostCombo->currentText().isEmpty() &&
|
|
!portLineEdit->text().isEmpty());
|
|
|
|
}
|