diff --git a/examples/corelib/ipc/doc/images/localfortuneserver-example.png b/examples/corelib/ipc/doc/images/localfortuneserver-example.png index 2f04c7528eb..778c7c85b04 100644 Binary files a/examples/corelib/ipc/doc/images/localfortuneserver-example.png and b/examples/corelib/ipc/doc/images/localfortuneserver-example.png differ diff --git a/examples/corelib/ipc/localfortuneserver/server.cpp b/examples/corelib/ipc/localfortuneserver/server.cpp index dcf13b0f379..77322e03bdc 100644 --- a/examples/corelib/ipc/localfortuneserver/server.cpp +++ b/examples/corelib/ipc/localfortuneserver/server.cpp @@ -3,32 +3,33 @@ #include "server.h" +#include #include #include #include +#include #include #include #include #include +using namespace Qt::StringLiterals; + +static const QString idleStateText = QObject::tr("Press \"Listen\" to start the server"); + 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); - 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->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.") << 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("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")); quitButton->setAutoDefault(false); connect(quitButton, &QPushButton::clicked, this, &Server::close); - connect(server, &QLocalServer::newConnection, this, &Server::sendFortune); - QHBoxLayout *buttonLayout = new QHBoxLayout; - buttonLayout->addStretch(1); - buttonLayout->addWidget(quitButton); - buttonLayout->addStretch(1); + QDialogButtonBox *buttonBox = new QDialogButtonBox; + buttonBox->addButton(listenButton, QDialogButtonBox::ActionRole); + buttonBox->addButton(stopListeningButton, QDialogButtonBox::ActionRole); + buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole); - QVBoxLayout *mainLayout = new QVBoxLayout(this); - mainLayout->addWidget(statusLabel); - mainLayout->addLayout(buttonLayout); + QGridLayout *mainLayout = new QGridLayout(this); + mainLayout->addWidget(hostLabel, 0, 0); + mainLayout->addWidget(hostLineEdit, 0, 1); + mainLayout->addWidget(statusLabel, 2, 0, 3, 2); + mainLayout->addWidget(buttonBox, 10, 0, 2, 2); 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() diff --git a/examples/corelib/ipc/localfortuneserver/server.h b/examples/corelib/ipc/localfortuneserver/server.h index 1aa63c8d220..1efba8fca9d 100644 --- a/examples/corelib/ipc/localfortuneserver/server.h +++ b/examples/corelib/ipc/localfortuneserver/server.h @@ -6,7 +6,10 @@ #include #include +#include +#include #include +#include class Server : public QDialog { @@ -17,8 +20,17 @@ public: private: void sendFortune(); + void toggleListenButton(); + void listenToServer(); + void stopListening(); + QLocalServer *server; + QLineEdit *hostLineEdit; + QLabel *statusLabel; + QPushButton *listenButton; + QPushButton *stopListeningButton; QStringList fortunes; + QString name; }; #endif