C++ 在已经运行c++;控制台应用程序

C++ 在已经运行c++;控制台应用程序,c++,qtgui,C++,Qtgui,我有一个正在运行的ATM控制台应用程序,我想修改它,使它有一个GUI,使用Qt库 我试图在不改变大部分代码的情况下实现它;相反,我想调用一个小部件,我使用的是cout或cin。但问题是,当我运行console应用程序时,它只是加载表单并继续,而不允许我输入所需的信息。我希望这是有道理的 void ATM::authenticateUser() { screen.displayMessage("\nPlease enter your account number: "); int

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

我试图在不改变大部分代码的情况下实现它;相反,我想调用一个小部件,我使用的是
cout
cin
。但问题是,当我运行console应用程序时,它只是加载表单并继续,而不允许我输入所需的信息。我希望这是有道理的

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`

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

<代码> //标准C++标题: #包括 #包括 //Qt头: #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 布尔evalInput(常量字符串和帐户、常量字符串和pin) {
这听起来很难。控制台应用程序通常有严格的输入、处理和输出顺序。具有图形用户界面的应用程序通常允许“随机访问”输入由事件驱动系统实现的字段。如果应用程序分为输入部分、处理部分和输出部分,则可以通过Qt输入对话框“交换”输入部分。请提供(不要太大)反映您当前应用程序的示例代码。然后应该可以显示Qt可以添加到何处(以及如何添加)。这就是控制台应用程序代码的当前设置可能是,我误解了您的问题。另一种方法是,编写调用您的控制台应用程序的Qt应用程序(使用
QProcess
),使用管道(I/O重定向)为控制台应用程序提供数据,并读取输出以供显示。大写“I”,添加了代码格式,重新编写了一点,将文本分为两段。顺便说一句,这里的代码被改写了。你只是重复代码的功能。注释应该添加信息,而不是重复。这段代码很容易理解,不需要注释。尤其是“如果结束”看起来真的没用(这是一个三行代码块!).
// 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();
}