mirror of
https://github.com/crystalidea/qt6windows7.git
synced 2025-07-04 00:05:25 +08:00
qt 6.5.1 original
This commit is contained in:
39
examples/network/blockingfortuneclient/CMakeLists.txt
Normal file
39
examples/network/blockingfortuneclient/CMakeLists.txt
Normal file
@ -0,0 +1,39 @@
|
||||
# Copyright (C) 2022 The Qt Company Ltd.
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(blockingfortuneclient LANGUAGES CXX)
|
||||
|
||||
if(NOT DEFINED INSTALL_EXAMPLESDIR)
|
||||
set(INSTALL_EXAMPLESDIR "examples")
|
||||
endif()
|
||||
|
||||
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/network/blockingfortuneclient")
|
||||
|
||||
find_package(Qt6 REQUIRED COMPONENTS Core Gui Network Widgets)
|
||||
|
||||
qt_standard_project_setup()
|
||||
|
||||
qt_add_executable(blockingfortuneclient
|
||||
blockingclient.cpp blockingclient.h
|
||||
fortunethread.cpp fortunethread.h
|
||||
main.cpp
|
||||
)
|
||||
|
||||
set_target_properties(blockingfortuneclient PROPERTIES
|
||||
WIN32_EXECUTABLE TRUE
|
||||
MACOSX_BUNDLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(blockingfortuneclient PRIVATE
|
||||
Qt6::Core
|
||||
Qt6::Gui
|
||||
Qt6::Network
|
||||
Qt6::Widgets
|
||||
)
|
||||
|
||||
install(TARGETS blockingfortuneclient
|
||||
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
)
|
133
examples/network/blockingfortuneclient/blockingclient.cpp
Normal file
133
examples/network/blockingfortuneclient/blockingclient.cpp
Normal file
@ -0,0 +1,133 @@
|
||||
// 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);
|
||||
}
|
48
examples/network/blockingfortuneclient/blockingclient.h
Normal file
48
examples/network/blockingfortuneclient/blockingclient.h
Normal file
@ -0,0 +1,48 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#ifndef BLOCKINGCLIENT_H
|
||||
#define BLOCKINGCLIENT_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
#include "fortunethread.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QDialogButtonBox;
|
||||
class QLabel;
|
||||
class QLineEdit;
|
||||
class QPushButton;
|
||||
class QAction;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
//! [0]
|
||||
class BlockingClient : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
BlockingClient(QWidget *parent = nullptr);
|
||||
|
||||
private slots:
|
||||
void requestNewFortune();
|
||||
void showFortune(const QString &fortune);
|
||||
void displayError(int socketError, const QString &message);
|
||||
void enableGetFortuneButton();
|
||||
|
||||
private:
|
||||
QLabel *hostLabel;
|
||||
QLabel *portLabel;
|
||||
QLineEdit *hostLineEdit;
|
||||
QLineEdit *portLineEdit;
|
||||
QLabel *statusLabel;
|
||||
QPushButton *getFortuneButton;
|
||||
QPushButton *quitButton;
|
||||
QDialogButtonBox *buttonBox;
|
||||
|
||||
FortuneThread thread;
|
||||
QString currentFortune;
|
||||
};
|
||||
//! [0]
|
||||
|
||||
#endif
|
@ -0,0 +1,12 @@
|
||||
QT += network widgets
|
||||
|
||||
HEADERS = blockingclient.h \
|
||||
fortunethread.h
|
||||
SOURCES = blockingclient.cpp \
|
||||
main.cpp \
|
||||
fortunethread.cpp
|
||||
|
||||
# install
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/network/blockingfortuneclient
|
||||
INSTALLS += target
|
||||
|
90
examples/network/blockingfortuneclient/fortunethread.cpp
Normal file
90
examples/network/blockingfortuneclient/fortunethread.cpp
Normal file
@ -0,0 +1,90 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include <QtNetwork>
|
||||
|
||||
#include "fortunethread.h"
|
||||
|
||||
FortuneThread::FortuneThread(QObject *parent)
|
||||
: QThread(parent), quit(false)
|
||||
{
|
||||
}
|
||||
|
||||
//! [0]
|
||||
FortuneThread::~FortuneThread()
|
||||
{
|
||||
mutex.lock();
|
||||
quit = true;
|
||||
cond.wakeOne();
|
||||
mutex.unlock();
|
||||
wait();
|
||||
}
|
||||
//! [0]
|
||||
|
||||
//! [1] //! [2]
|
||||
void FortuneThread::requestNewFortune(const QString &hostName, quint16 port)
|
||||
{
|
||||
//! [1]
|
||||
QMutexLocker locker(&mutex);
|
||||
this->hostName = hostName;
|
||||
this->port = port;
|
||||
//! [3]
|
||||
if (!isRunning())
|
||||
start();
|
||||
else
|
||||
cond.wakeOne();
|
||||
}
|
||||
//! [2] //! [3]
|
||||
|
||||
//! [4]
|
||||
void FortuneThread::run()
|
||||
{
|
||||
mutex.lock();
|
||||
//! [4] //! [5]
|
||||
QString serverName = hostName;
|
||||
quint16 serverPort = port;
|
||||
mutex.unlock();
|
||||
//! [5]
|
||||
|
||||
//! [6]
|
||||
while (!quit) {
|
||||
//! [7]
|
||||
const int Timeout = 5 * 1000;
|
||||
|
||||
QTcpSocket socket;
|
||||
socket.connectToHost(serverName, serverPort);
|
||||
//! [6] //! [8]
|
||||
|
||||
if (!socket.waitForConnected(Timeout)) {
|
||||
emit error(socket.error(), socket.errorString());
|
||||
return;
|
||||
}
|
||||
//! [8] //! [11]
|
||||
|
||||
QDataStream in(&socket);
|
||||
in.setVersion(QDataStream::Qt_6_5);
|
||||
QString fortune;
|
||||
//! [11] //! [12]
|
||||
|
||||
do {
|
||||
if (!socket.waitForReadyRead(Timeout)) {
|
||||
emit error(socket.error(), socket.errorString());
|
||||
return;
|
||||
}
|
||||
|
||||
in.startTransaction();
|
||||
in >> fortune;
|
||||
} while (!in.commitTransaction());
|
||||
//! [12] //! [15]
|
||||
|
||||
mutex.lock();
|
||||
emit newFortune(fortune);
|
||||
//! [7]
|
||||
|
||||
cond.wait(&mutex);
|
||||
serverName = hostName;
|
||||
serverPort = port;
|
||||
mutex.unlock();
|
||||
}
|
||||
//! [15]
|
||||
}
|
36
examples/network/blockingfortuneclient/fortunethread.h
Normal file
36
examples/network/blockingfortuneclient/fortunethread.h
Normal file
@ -0,0 +1,36 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#ifndef FORTUNETHREAD_H
|
||||
#define FORTUNETHREAD_H
|
||||
|
||||
#include <QThread>
|
||||
#include <QMutex>
|
||||
#include <QWaitCondition>
|
||||
|
||||
//! [0]
|
||||
class FortuneThread : public QThread
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
FortuneThread(QObject *parent = nullptr);
|
||||
~FortuneThread();
|
||||
|
||||
void requestNewFortune(const QString &hostName, quint16 port);
|
||||
void run() override;
|
||||
|
||||
signals:
|
||||
void newFortune(const QString &fortune);
|
||||
void error(int socketError, const QString &message);
|
||||
|
||||
private:
|
||||
QString hostName;
|
||||
quint16 port;
|
||||
QMutex mutex;
|
||||
QWaitCondition cond;
|
||||
bool quit;
|
||||
};
|
||||
//! [0]
|
||||
|
||||
#endif
|
14
examples/network/blockingfortuneclient/main.cpp
Normal file
14
examples/network/blockingfortuneclient/main.cpp
Normal file
@ -0,0 +1,14 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
#include "blockingclient.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
BlockingClient client;
|
||||
client.show();
|
||||
return app.exec();
|
||||
}
|
Reference in New Issue
Block a user