Revision control
++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ #include <QtWidgets>
++ #include <QtNetwork>
++
++ #include "blockingclient.h"
++
++ BlockingClient::BlockingClient(QWidget *parent)
++ : QWidget(parent)
++ {
++ hostLabel = new QLabel(tr("&Server name:"));
++ portLabel = new QLabel(tr("S&erver port:"));
++
++ // find out which IP to connect to
++ QString ipAddress;
++ const QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
++ // use the first non-localhost IPv4 address
++ for (const QHostAddress &entry : ipAddressesList) {
++ if (entry != QHostAddress::LocalHost && entry.toIPv4Address()) {
++ ipAddress = entry.toString();
++ break;
++ }
++ }
++ // if we did not find one, use IPv4 localhost
++ if (ipAddress.isEmpty())
++ ipAddress = QHostAddress(QHostAddress::LocalHost).toString();
++
++ hostLineEdit = new QLineEdit(ipAddress);
++ portLineEdit = new QLineEdit;
++ portLineEdit->setValidator(new QIntValidator(1, 65535, this));
++
++
++ hostLabel->setBuddy(hostLineEdit);
++ portLabel->setBuddy(portLineEdit);
++
++ statusLabel = new QLabel(tr("This examples requires that you run the "
++ "Fortune Server example as well."));
++ statusLabel->setWordWrap(true);
++
++ getFortuneButton = new QPushButton(tr("Get Fortune"));
++ getFortuneButton->setDefault(true);
++ getFortuneButton->setEnabled(false);
++
++ quitButton = new QPushButton(tr("Quit"));
++
++ buttonBox = new QDialogButtonBox;
++ buttonBox->addButton(getFortuneButton, QDialogButtonBox::ActionRole);
++ buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
++
++ connect(getFortuneButton, &QPushButton::clicked,
++ this, &BlockingClient::requestNewFortune);
++ connect(quitButton, &QPushButton::clicked,
++ this, &BlockingClient::close);
++
++ connect(hostLineEdit, &QLineEdit::textChanged,
++ this, &BlockingClient::enableGetFortuneButton);
++ connect(portLineEdit, &QLineEdit::textChanged,
++ this, &BlockingClient::enableGetFortuneButton);
++ //! [0]
++ connect(&thread, &FortuneThread::newFortune,
++ this, &BlockingClient::showFortune);
++ connect(&thread, &FortuneThread::error,
++ this, &BlockingClient::displayError);
++ //! [0]
++
++ QGridLayout *mainLayout = new QGridLayout;
++ mainLayout->addWidget(hostLabel, 0, 0);
++ mainLayout->addWidget(hostLineEdit, 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);
++ setLayout(mainLayout);
++
++ setWindowTitle(tr("Blocking Fortune Client"));
++ portLineEdit->setFocus();
++ }
++
++ //! [1]
++ void BlockingClient::requestNewFortune()
++ {
++ getFortuneButton->setEnabled(false);
++ thread.requestNewFortune(hostLineEdit->text(),
++ portLineEdit->text().toInt());
++ }
++ //! [1]
++
++ //! [2]
++ void BlockingClient::showFortune(const QString &nextFortune)
++ {
++ if (nextFortune == currentFortune) {
++ requestNewFortune();
++ return;
++ }
++ //! [2]
++
++ //! [3]
++ currentFortune = nextFortune;
++ statusLabel->setText(currentFortune);
++ getFortuneButton->setEnabled(true);
++ }
++ //! [3]
++
++ void BlockingClient::displayError(int socketError, const QString &message)
++ {
++ switch (socketError) {
++ case QAbstractSocket::HostNotFoundError:
++ QMessageBox::information(this, tr("Blocking Fortune Client"),
++ tr("The host was not found. Please check the "
++ "host and port settings."));
++ break;
++ case QAbstractSocket::ConnectionRefusedError:
++ QMessageBox::information(this, tr("Blocking 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("Blocking Fortune Client"),
++ tr("The following error occurred: %1.")
++ .arg(message));
++ }
++
++ getFortuneButton->setEnabled(true);
++ }
++
++ void BlockingClient::enableGetFortuneButton()
++ {
++ bool enable(!hostLineEdit->text().isEmpty() && !portLineEdit->text().isEmpty());
++ getFortuneButton->setEnabled(enable);
++ }