Revamp Local Fortune Server Example: Allow specifying the server name

The server used to hardcode the name while the client allows the
user to specify it. The server's UI is adjusted to let the user first
specify the server name he wants to listen to and second stop listening
to the current server.

Task-number: QTBUG-117064
Pick-to: 6.6 6.5
Change-Id: I80fc976151ead7a181fbc32080597277bc515313
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
This commit is contained in:
Rym Bouabid 2023-09-19 12:49:14 +02:00
parent 0c4b2779ff
commit a8e8a77bc5
3 changed files with 77 additions and 21 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -3,32 +3,33 @@
#include "server.h" #include "server.h"
#include <QDialogButtonBox>
#include <QGuiApplication> #include <QGuiApplication>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
#include <QLineEdit>
#include <QLocalSocket> #include <QLocalSocket>
#include <QMessageBox> #include <QMessageBox>
#include <QPushButton> #include <QPushButton>
#include <QRandomGenerator> #include <QRandomGenerator>
using namespace Qt::StringLiterals;
static const QString idleStateText = QObject::tr("Press \"Listen\" to start the server");
Server::Server(QWidget *parent) Server::Server(QWidget *parent)
: QDialog(parent) : QDialog(parent),
server(new QLocalServer(this)),
hostLineEdit(new QLineEdit(u"fortune"_s)),
statusLabel(new QLabel(idleStateText)),
listenButton(new QPushButton(tr("Listen"))),
stopListeningButton(new QPushButton(tr("Stop Listening")))
{ {
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
server = new QLocalServer(this);
if (!server->listen("fortune")) {
QMessageBox::critical(this, tr("Local Fortune Server"),
tr("Unable to start the server: %1.")
.arg(server->errorString()));
close();
return;
}
QLabel *statusLabel = new QLabel;
statusLabel->setWordWrap(true); statusLabel->setWordWrap(true);
statusLabel->setText(tr("The server is running.\n"
"Run the Local Fortune Client example now.")); stopListeningButton->setDisabled(true);
fortunes << tr("You've been leading a dog's life. Stay off the furniture.") fortunes << tr("You've been leading a dog's life. Stay off the furniture.")
<< tr("You've got to think about tomorrow.") << tr("You've got to think about tomorrow.")
@ -38,21 +39,64 @@ Server::Server(QWidget *parent)
<< tr("You cannot kill time without injuring eternity.") << tr("You cannot kill time without injuring eternity.")
<< tr("Computers are not intelligent. They only think they are."); << tr("Computers are not intelligent. They only think they are.");
QLabel *hostLabel = new QLabel(tr("Server name:"));
connect(server, &QLocalServer::newConnection, this, &Server::sendFortune);
connect(hostLineEdit, &QLineEdit::textChanged, this, &Server::toggleListenButton);
connect(listenButton, &QPushButton::clicked, this, &Server::listenToServer);
connect(stopListeningButton, &QPushButton::clicked,this, &Server::stopListening);
QPushButton *quitButton = new QPushButton(tr("Quit")); QPushButton *quitButton = new QPushButton(tr("Quit"));
quitButton->setAutoDefault(false); quitButton->setAutoDefault(false);
connect(quitButton, &QPushButton::clicked, this, &Server::close); connect(quitButton, &QPushButton::clicked, this, &Server::close);
connect(server, &QLocalServer::newConnection, this, &Server::sendFortune);
QHBoxLayout *buttonLayout = new QHBoxLayout; QDialogButtonBox *buttonBox = new QDialogButtonBox;
buttonLayout->addStretch(1); buttonBox->addButton(listenButton, QDialogButtonBox::ActionRole);
buttonLayout->addWidget(quitButton); buttonBox->addButton(stopListeningButton, QDialogButtonBox::ActionRole);
buttonLayout->addStretch(1); buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
QVBoxLayout *mainLayout = new QVBoxLayout(this); QGridLayout *mainLayout = new QGridLayout(this);
mainLayout->addWidget(statusLabel); mainLayout->addWidget(hostLabel, 0, 0);
mainLayout->addLayout(buttonLayout); mainLayout->addWidget(hostLineEdit, 0, 1);
mainLayout->addWidget(statusLabel, 2, 0, 3, 2);
mainLayout->addWidget(buttonBox, 10, 0, 2, 2);
setWindowTitle(QGuiApplication::applicationDisplayName()); setWindowTitle(QGuiApplication::applicationDisplayName());
hostLineEdit->setFocus();
}
void Server::listenToServer()
{
name = hostLineEdit->text();
if (!server->listen(name)) {
QMessageBox::critical(this, tr("Local Fortune Server"),
tr("Unable to start the server: %1.")
.arg(server->errorString()));
name.clear();
return;
}
statusLabel->setText(tr("The server is running.\n"
"Run the Local Fortune Client example now."));
toggleListenButton();
}
void Server::stopListening()
{
server->close();
name.clear();
statusLabel->setText(idleStateText);
toggleListenButton();
}
void Server::toggleListenButton()
{
if (server->isListening()) {
listenButton->setDisabled(true);
stopListeningButton->setEnabled(true);
} else {
listenButton->setEnabled(!hostLineEdit->text().isEmpty());
stopListeningButton->setDisabled(true);
}
} }
void Server::sendFortune() void Server::sendFortune()

View File

@ -6,7 +6,10 @@
#include <QApplication> #include <QApplication>
#include <QDialog> #include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QLocalServer> #include <QLocalServer>
#include <QPushButton>
class Server : public QDialog class Server : public QDialog
{ {
@ -17,8 +20,17 @@ public:
private: private:
void sendFortune(); void sendFortune();
void toggleListenButton();
void listenToServer();
void stopListening();
QLocalServer *server; QLocalServer *server;
QLineEdit *hostLineEdit;
QLabel *statusLabel;
QPushButton *listenButton;
QPushButton *stopListeningButton;
QStringList fortunes; QStringList fortunes;
QString name;
}; };
#endif #endif