在已经运行的C++控制台应用程序上实现Qt Gui
问题描述:
我有一个正在运行的ATM控制台应用程序,我想修改它,使它具有使用Qt库的GUI。在已经运行的C++控制台应用程序上实现Qt Gui
我试图在不改变大部分代码的情况下实现它;相反,我想打电话给我正在使用的小工具cout
或cin
。但问题是,当我运行控制台应用程序时,它只是加载表单并继续而不让我输入所需的信息。我希望这是有道理的。
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`
答
这是一个很小但完整样本,以提供“主意”:
// 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
创造,而不是把局部变量,像我一样,保持代码的短。
这听起来很难。控制台应用程序通常具有严格的输入,处理和输出序列。具有图形用户界面的应用程序通常允许对由事件驱动系统实现的输入字段进行“随机访问”。如果你的appl。分为输入部分,处理部分和输出部分,那么应该可以通过Qt输入对话框“交换”输入部分。请提供(不要太大)反映您当前应用程序的示例代码。然后应该可以显示Qt可以在哪里添加(以及如何)。 – Scheff
这就是当前设置的控制台应用程序代码 –
可能是,我误解了你的问题。另一种方法是,编写一个调用您的控制台应用程序的Qt应用程序(使用'QProcess'),使用管道(I/O重定向)为控制台应用程序提供内容并为显示目的读取输出。 – Scheff