2017-03-06 79 views
0

我有一個正在運行的ATM控制檯應用程序,我想修改它,使它具有使用Qt庫的GUI。在已經運行的C++控制檯應用程序上實現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` 
+1

這聽起來很難。控制檯應用程序通常具有嚴格的輸入,處理和輸出序列。具有圖形用戶界面的應用程序通常允許對由事件驅動系統實現的輸入字段進行「隨機訪問」。如果你的appl。分爲輸入部分,處理部分和輸出部分,那麼應該可以通過Qt輸入對話框「交換」輸入部分。請提供(不要太大)反映您當前應用程序的示例代碼。然後應該可以顯示Qt可以在哪裏添加(以及如何)。 – Scheff

+0

這就是當前設置的控制檯應用程序代碼 –

+0

可能是,我誤解了你的問題。另一種方法是,編寫一個調用您的控制檯應用程序的Qt應用程序(使用'QProcess'),使用管道(I/O重定向)爲控制檯應用程序提供內容併爲顯示目的讀取輸出。 – Scheff

回答

0

這是一個很小但完整樣本,以提供「主意」:

// 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創造,而不是把局部變量,像我一樣,保持代碼的短。

相關問題