来自 Qt 中 main.cpp 代码的 MainWindow

2023-11-29

想要了解之间的代码差异MainWindowmain.cpp。具体来说,如何专门编写一段代码main.cpp需要修改为的一部分mainwindow.cpp and mainwindow.h.

作为一个例子,我试图修改这个罚款的代码answer工作于MainWindow.

main.cpp

#include <QtWidgets>
#include <QtNetwork>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //setup GUI (you could be doing this in the designer)
    QWidget widget;
    QFormLayout layout(&widget);
    QLineEdit lineEditName;
    QLineEdit lineEditGender;
    QLineEdit lineEditRegion;
    auto edits = {&lineEditName, &lineEditGender, &lineEditRegion};
    for(auto edit : edits) edit->setReadOnly(true);
    layout.addRow("Name:", &lineEditName);
    layout.addRow("Gender:", &lineEditGender);
    layout.addRow("Region:", &lineEditRegion);
    QPushButton button("Get Name");
    layout.addRow(&button);

    //send request to uinames API
    QNetworkAccessManager networkManager;
    QObject::connect(&networkManager, &QNetworkAccessManager::finished,
                 [&](QNetworkReply* reply){
        //this lambda is called when the reply is received
        //it can be a slot in your GUI window class
        //check for errors
        if(reply->error() != QNetworkReply::NoError){
            for(auto edit : edits) edit->setText("Error");
            networkManager.clearAccessCache();
        } else {
            //parse the reply JSON and display result in the UI
            QJsonObject jsonObject=     QJsonDocument::fromJson(reply->readAll()).object();
            QString fullName= jsonObject["name"].toString();
            fullName.append(" ");
            fullName.append(jsonObject["surname"].toString());
            lineEditName.setText(fullName);
            lineEditGender.setText(jsonObject["gender"].toString());
            lineEditRegion.setText(jsonObject["region"].toString());
        }
        button.setEnabled(true);
        reply->deleteLater();
        });
     //url parameters
    QUrlQuery query;
    query.addQueryItem("amount", "1");
    query.addQueryItem("region", "United States");
    QUrl url("http://uinames.com/api/");
    url.setQuery(query);
    QNetworkRequest networkRequest(url);
    //send GET request when the button is clicked
    QObject::connect(&button, &QPushButton::clicked, [&](){
        networkManager.get(networkRequest);
        button.setEnabled(false);
        for(auto edit : edits) edit->setText("Loading. . .");
    });

    widget.show();
    return a.exec();
}

edit

添加了同一答案的计时器部分;请演示这个带有计时器的版本是如何完成的

QTimer timer;
QObject::connect(&timer, &QTimer::timeout, [&](){
    networkManager.get(networkRequest);
    button.setEnabled(false);
    for(auto edit : edits) edit->setText("Loading. . .");
});
timer.start(60000); //60000 msecs = 60 secs

我很难修改networkManager作为类成员,如何构建代码以及如何替换 lambda 函数。

如果有人可以为我提供所有必要的修改以获得更好的理解,那就太好了。


您可能希望将用户界面和控制器(业务逻辑)分离到单独的类中。

的身体main()实例化 ui 和控制器并连接它们。每 5 秒获取新结果的计时器。计时器可以卷入Controller,我也将其单独展示为向现有类添加功能而不修改它的示例。

main.cpp

// https://github.com/KubaO/stackoverflown/tree/master/questions/into-mainwin-39643510
#include "mainwindow.h"
#include "controller.h"

int main(int argc, char *argv[])
{
   QApplication app{argc, argv};
   MainWindow ui;
   Controller ctl;
   QTimer timer;
   timer.start(5*1000);
   QObject::connect(&timer, &QTimer::timeout, &ctl, &Controller::get);

   QObject::connect(&ctl, &Controller::busy, &ui, [&]{ ui.setState(MainWindow::Loading); });
   QObject::connect(&ui, &MainWindow::request, &ctl, &Controller::get);
   QObject::connect(&ctl, &Controller::error, &ui, [&]{ ui.setState(MainWindow::Error); });
   QObject::connect(&ctl, &Controller::values, &ui, &MainWindow::setFields);
   ui.show();
   return app.exec();
}

控制器对用户界面一无所知,只负责处理请求。它发出一个busy每次开始处理请求时都会发出信号。

如果您想为多个活动请求提供更好的反馈,busy仅当没有待处理的请求并且添加了新请求时才需要发出信号,并且idle当最后一个请求完成并且没有更多待处理的请求时,将发出信号。

控制器.h

#ifndef CONTROLLER_H
#define CONTROLLER_H

#include <QtNetwork>

class Controller : public QObject {
   Q_OBJECT
   QNetworkAccessManager manager{this};
   QNetworkRequest request;
   Q_SLOT void onReply(QNetworkReply *);
public:
   explicit Controller(QObject * parent = nullptr);
   Q_SLOT void get();
   Q_SIGNAL void busy();
   Q_SIGNAL void error(const QString &);
   Q_SIGNAL void values(const QString & name, const QString & gender, const QString & region);
};

#endif // CONTROLLER_H

控制器.cpp

#include "controller.h"

Controller::Controller(QObject *parent) : QObject(parent)
{
   QUrlQuery query;
   query.addQueryItem("amount", "1");
   query.addQueryItem("region", "United States");
   QUrl url("http://uinames.com/api/");
   url.setQuery(query);
   request = QNetworkRequest(url);
   connect(&manager, &QNetworkAccessManager::finished, this, &Controller::onReply);
}

void Controller::onReply(QNetworkReply * reply) {
   if (reply->error() != QNetworkReply::NoError) {
      emit error(reply->errorString());
      manager.clearAccessCache();
   } else {
      //parse the reply JSON and display result in the UI
      auto jsonObject = QJsonDocument::fromJson(reply->readAll()).object();
      auto fullName = jsonObject["name"].toString();
      fullName.append(" ");
      fullName.append(jsonObject["surname"].toString());
      emit values(fullName, jsonObject["gender"].toString(), jsonObject["region"].toString());
   }
   reply->deleteLater();
}

void Controller::get() {
   emit busy();
   manager.get(request);
}

用户界面不知道任何业务逻辑,它提供了一个足以供业务逻辑使用它的 API。它可以处于以下三种状态之一:Normal结果可见的状态,Loading显示忙碌反馈的状态,以及Error显示错误信息的状态。这setFields槽将状态返回到Normal.

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets>

class MainWindow : public QWidget {
  Q_OBJECT
  QFormLayout layout{this};
  QLineEdit lineEditName;
  QLineEdit lineEditGender;
  QLineEdit lineEditRegion;
  QPushButton button{"Get Name"};
  QLineEdit * edits[3] = {&lineEditName, &lineEditGender, &lineEditRegion};
public:
  enum State { Normal, Loading, Error };
  explicit MainWindow(QWidget * parent = nullptr);
  Q_SLOT void setFields(const QString & name, const QString & gender, const QString & region);
  Q_SLOT void setState(State);
  Q_SIGNAL void request();
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QWidget(parent)
{
   for(auto edit : edits) edit->setReadOnly(true);
   layout.addRow("Name:", &lineEditName);
   layout.addRow("Gender:", &lineEditGender);
   layout.addRow("Region:", &lineEditRegion);
   layout.addRow(&button);
   connect(&button, &QPushButton::clicked, this, &MainWindow::request);
}

void MainWindow::setFields(const QString & name, const QString & gender, const QString & region) {
   setState(Normal);
   lineEditName.setText(name);
   lineEditGender.setText(gender);
   lineEditRegion.setText(region);
}

void MainWindow::setState(MainWindow::State state) {
   if (state == Normal) {
      for (auto edit : edits) edit->setEnabled(true);
      button.setEnabled(true);
   }
   else if (state == Loading) {
      for (auto edit : edits) edit->setEnabled(false);
      button.setEnabled(false);
   }
   else if (state == Error) {
      for (auto edit : edits) edit->setText("Error...");
      button.setEnabled(true);
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 Qt 中 main.cpp 代码的 MainWindow 的相关文章

  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • Qt:在多个布局中使用一个小部件

    我有一个 QTabBar 所有选项卡都应该有相同的小部件 layout1 gt addWidget w layout2 gt addWidget w 然而打电话addWidget第二次导致该小部件在第一个布局中消失 有没有办法使用一个小部件
  • QT从QTableWidgetItem继承到Widget并覆盖'<'运算符

    我想要一个QTableWidget具有定制的某些单元QProgressBars 并且我希望能够对包含这些的列进行排序 我的定制QProgressBar继承自两者QProgressBar and QTableWidgetItem 并且我正在覆
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 静态变量中的 qt tr()

    我在 qt 中的翻译方面遇到问题 我的项目中的所有翻译都工作正常 但有一个翻译位于类的静态变量中 相应部分代码如下 头文件类似于这样 typedef struct int type QString problematicString inf
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 如何禁用 Qt Creator 中的“问题”窗格?

    我发现使用编译器输出更容易 但 Qt Creator 中的 问题 窗格会在每次编译后自动弹出 隐藏有用的信息 迫使我每次都隐藏它 有没有办法禁用这种行为 我不介意收集错误 我只是不希望每次我不要求时都显示这个特定的 UI 我使用的是 Qt

随机推荐

  • 如何在 iOS 上获取音频音量级别和音量更改通知?

    我正在编写一个非常简单的应用程序 按下按钮时会播放声音 由于当设备设置为静音时该按钮没有多大意义 因此我想在设备的音量为零时禁用它 然后当音量再次调高时重新启用它 我正在寻找一种可行的 并且 AppStore 安全的 方法检测当前音量设置并
  • 了解 Web 身份验证上下文中的 JSON Web 令牌 (JWT)

    Web 客户端 服务器身份验证上下文中有关 JWT 的一些声明 JWT 对于中间人攻击并不安全 从安全角度来说 从客户端向服务器发送 JWT 相当于发送哈希密码 JWT 可以携带用户详细信息作为有效负载 使用这些数据而不访问数据库中的实际数
  • 在不规则形状内渲染 CoreText

    我正在寻找有关实现渲染视图的指导NSAttributedString在有孔的多边形内 包裹并重排文本以适应几何形状 它不是CoreText这就是问题所在 但是将不规则形状划分为有序的蹲矩形序列的一般问题 类似的问题尚未得到完全解答 如何在
  • 如何在React Route中传递id

    当我想从产品列表中按 ID 查看产品时 我想构建一个页面 在我的应用程序文件中 我有类似的内容
  • 使用 jQuery 获取边框样式

    我如何使用 jQuery 获得边框样式 以下内容不起作用 get click function var x div css borderStyle alert x Check http jsfiddle net s7YAN 31 alert
  • Mozilla 3.0.8 和 Chrome 高度错误解决方法

    我有一个textarea里面一个div div div
  • 使用大小写“透视”键|值表会返回空白列... mySQL

    我正在尝试将键 值格式的数据转换为每个条目一行 源数据库是 mysql 我知道我需要使用 Case 语句才能进行透视 并且遵循了该站点上的一些示例来构建我的查询 但是 我只返回一列数据 其余列中为空白 源表格式 user id meta k
  • 分配时的 JavaScript 评估顺序

    JavaScript 在什么时候确定赋值的左侧 是在评估右侧之前还是之后 例如 这段代码的作用是什么 var arr thing 1 thing 2 thing 3 last true arr arr length 1 newField a
  • 通过 PHP 或任何其他脚本创建电子邮件地址

    我需要为我的用户创建代理电子邮件地址 电子邮件地址将类似于 email protected 但最好我想要更好看的电子邮件地址 例如 email protected 发送到此地址的电子邮件应转发到用户不会暴露的真实电子邮件地址 例如 emai
  • 无法对数组类型调用 add

    我得到了一些需要修改的代码 这是一个囚徒困境游戏 最初玩家被设置了这段代码到一个数组中 IPDPlayer currentPlayers new RandomPlayer new TFTPlayer new TFTPlayer new TF
  • 如何在pyglet中连续播放音乐

    我和我的朋友正在开发一款游戏 我们希望音乐在游戏运 行时循环播放 求助 好像没有重复播放音乐的功能 在当前版本的 pyglet 中 您应该使用SourceGroup 设置loop归因于True 然后您可以将其排队到Player播放它 snd
  • javascript倒计时器暂停恢复

    起初 我的倒计时器没有暂停和恢复功能 并且计时器运行得很好 现在我刚刚添加了该功能 暂停没有问题 但恢复时间有问题 时间不会从当前位置开始显示 也不会从那里开始倒计时 如何更改我的代码 pause click function Get cu
  • Android 浮动操作按钮未返回到初始位置

    如果 FAB 浮动操作按钮 在小吃栏出现之前隐藏 在 CoordinatorLayout 中 那么下次我显示 FAB 时 它会在旧位置绘制 不会向下移动到原始位置 如果当小吃栏消失时 FAB 可见 则一切都按预期工作 我错过了什么还是一个错
  • “Set-AzureRmDataFactoryV2”未被识别为 cmdlet 的名称

    我已经在 Ubuntu 16 04 上安装了 Powershell 6 0 0 尝试使用 Powershell 创建 Azure 数据工厂时出现以下错误 Set AzureRmDataFactoryV2 The term Set Azure
  • 获取mp3文件长度

    我目前正在尝试用 C 编写一个音频播放器 我正在使用 BASS 库来处理播放音乐 但现在我在获取歌曲长度方面遇到了小问题 好吧 我读过 BASS 文档并找到了一种方法 我需要做的 所有 就是 int stream Bass BASS Str
  • 使用 Containable 对关联模型 (HABTM) 上的条件过滤的结果进行分页

    我需要对列表进行分页Products 属于特定Category HABTM 协会 In my Product我有的型号 var actsAs array Containable var hasAndBelongsToMany array C
  • 如何在cmake中链接所有LLVM库?

    我想链接我的 cmake C 项目中的所有 LLVM 库 I use llvm config components为了获得 LLVM 的所有组件 它给了我 llvm config components aarch64 aarch64asmp
  • 使用 Greasemonkey 将日期选择器添加到文本框

    有一个需要日期但没有日期选择器的文本框 我想用 Greasemonkey 添加一个 我寻找一个例子 但找不到 这可能吗 有这样做的例子吗 它不需要很花哨 我喜欢用jQuery UI 的 datepicker 因为我通常都会加载 jQuery
  • 为什么 git 会在每个命令名称前添加“git-”?

    如果我需要帮助git status命令 我可以输入git help status 并返回一个帮助页面 显示名称为 git status But git status 不是命令 命令是git status有一个空格 而不是连字符 如果我输入g
  • 来自 Qt 中 main.cpp 代码的 MainWindow

    想要了解之间的代码差异MainWindow和main cpp 具体来说 如何专门编写一段代码main cpp需要修改为的一部分mainwindow cpp and mainwindow h 作为一个例子 我试图修改这个罚款的代码answer