在已经运行的 c++ 控制台应用程序上实现 Qt Gui

Posted

技术标签:

【中文标题】在已经运行的 c++ 控制台应用程序上实现 Qt Gui【英文标题】:Implementing Qt Gui on already running c++ console app 【发布时间】:2017-03-06 18:36:57 【问题描述】:

我有一个正在运行的 ATM 控制台应用程序,我想使用 Qt 库对其进行修改,使其具有 GUI。

我正在尝试在不更改大部分代码的情况下实现它;相反,我想在我使用coutcin 的地方调用一个小部件。但问题是,当我运行控制台应用程序时,它只是加载表单并继续,而不让我输入所需的信息。我希望这是有道理的。

void ATM::authenticateUser()

    screen.displayMessage("\nPlease enter your account number: ");
    int accountNumber = keypad.getInput(); // input account number
    screen.displayMessage("\nEnter your PIN: "); // prompt for PIN
    int pin = keypad.getInput(); // input PIN
    system("clear");
    // set userAuthenticated to bool value returned by database
    userAuthenticated = bankDatabase.authenticateUser(accountNumber, pin);
    // check whether authentication succeeded
    if (userAuthenticated) 
        currentAccountNumber = accountNumber; // save user's account #
     // end if
    else
        screen.displayMessageLine(
            "Invalid account number or PIN. Please try again.");
 // end function authenticateUser`

【问题讨论】:

这听起来很难。控制台应用程序通常具有严格的输入、处理、输出顺序。具有图形用户界面的应用程序通常允许“随机访问”由事件驱动系统实现的输入字段。如果你的应用程序。分为输入部分、处理部分和输出部分,那么应该可以通过 Qt 输入对话框“交换”输入部分。请提供(不要太大)反映您当前应用程序的示例代码。然后应该可以显示可以添加 Qt 的位置(以及如何添加)。 这是控制台应用程序代码的当前设置 可能是,我误解了你的问题。另一种方法是编写一个调用控制台应用程序的 Qt 应用程序(使用QProcess),使用管道(I/O 重定向)来为您的控制台应用程序提供数据并读取输出以进行显示。 大写“I”,添加代码格式,稍微改写,将文本分成两段。 附带说明,这里的代码被过度注释了。您只是在重复代码的作用。评论应该添加信息,而不是重复。这段代码通俗易懂,无需注释。尤其是“end if”看起来真的没用(它是一个 3 行块!)。 【参考方案1】:

这是一个提供“想法”的非常简单但完整的示例:

// standard C++ header:
#include <iostream>
#include <string>

// Qt header:
#include <QApplication>
#include <QGroupBox>
#include <QGridLayout>
#include <QLabel>
#include <QMainWindow>
#include <QMessageBox>
#include <QPushButton>
#include <QLineEdit>

using namespace std;

bool evalInput(const string &account, const string &pin)

  cout << "Account: '" << account << "'" << endl;
  cout << "PIN:     '" << pin << "'" << endl;
  /// @todo process account
  /// @todo process PIN
  return false;


int main(int argc, char **argv)

  // main application
#undef qApp // undef macro qApp out of the way
  QApplication qApp(argc, argv);
  // setup GUI
  QMainWindow qWin;
  QGroupBox qBox;
  QGridLayout qGrid;
  QLabel qLblAccount(QString::fromLatin1("Account: "));
  qGrid.addWidget(&qLblAccount, 0, 0);
  QLineEdit qTxtAccount;
  qGrid.addWidget(&qTxtAccount, 0, 1);
  QLabel qLblPIN(QString::fromLatin1("PIN: "));
  qGrid.addWidget(&qLblPIN, 1, 0);
  QLineEdit qTxtPIN;
  qTxtPIN.setEchoMode(QLineEdit::Password);
  qGrid.addWidget(&qTxtPIN, 1, 1);
  QPushButton qBtn(QString::fromLatin1("Send"));
  qGrid.addWidget(&qBtn, 2, 0, 1, 2);
  qBox.setLayout(&qGrid);
  qWin.setCentralWidget(&qBox);
  qWin.show();
  // install signal handlers
  QObject::connect(&qBtn, &QPushButton::clicked,
    [&qTxtAccount, &qTxtPIN]() 
      if (!evalInput(
        qTxtAccount.text().toStdString(),
        qTxtPIN.text().toStdString())) 
        QMessageBox::warning(&qTxtAccount,
          QString::fromLatin1("Wrong Input"),
          QString::fromLatin1(
            "Invalid account number or PIN.\nPlease try again."),
          QMessageBox::Ok);
      
      qTxtAccount.clear(); qTxtPIN.clear();
    );
  // run Qt application
  return qApp.exec();

Qt 有一个很好的在线文档,其中包含参考手册和一些有用的示例:Qt Widgets Examples。我使用文档来学习 Qt,真的可以推荐它作为起点。

注意:

正如您将在示例中看到的那样,Qt 小部件通常由 new 创建,而不是像我为保持代码简短而将它们设为局部变量。

【讨论】:

以上是关于在已经运行的 c++ 控制台应用程序上实现 Qt Gui的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 平板电脑上实现主从视图 Qt/QML?

如何在 C++ 程序中通过拓扑考虑在多核 HT 上实现亲和性?

如何连接两个程序(c++,qt)

在 main 上而不是在 pyqt5 的脚本上实现按钮的功能

gcc 如何在 linux 上实现 C++ 异常的堆栈展开?

如何在 2 个视图控制器上实现广告