在Qt Gui应用程序中更改控制台应用程序的概念

时间:2016-02-18 14:46:34

标签: c++ qt

实施了c ++课程"测验"通过控制台输入/输出与播放器交换信息,我想用Gui替换控制台。 因此,我实施了一个适当的课程" MainWindow" (QCheckboxesQButtonGroup,...)作为QWindow的子类。

现在,我怀疑这两个类的关系:

在我看来,"测验"有一个" MainWindow" (比如它的类型" quiz_content")。结果我放大了测验"通过指向QApplication的指针和指向" MainWindow"的指针。 "测验"的构造函数在堆上创建相应的元素并启动exec()例程。但是,信号(如buttonClicked())必须调用属于" quiz"的方法。 (没有插槽作为纯c ++)。

接下来尝试:" MainWindow"有一个" quiz"。所以我可以在所有初学者所显示的主内部QApplication开始。例子。我无法强烈反驳为什么我不喜欢这种关系。事实上,它似乎导致对quiz.play()的更大修改,这是一种管理游戏的方法。

问题:将传统代码与Qt应用程序结合起来的常用方法是什么?有多种可能性吗?关于重新实施" quiz"?

,哪个是最有效的

感谢您回答我的新手问题!

进一步说明:感谢您快速回复!对不起,我的问题没有明确表达。 正如你所提到的,我附上了一些代码(来自不同的.h / .cpp文件,所以 不要注意因申报单而导致的错误。 ) @Vlad:TU意味着技术大学,但你可以看到,我不是在学习计算机科学。

首先尝试:

class quiz{
public:
quiz(int& argc, char** argv,const char* file);
void play(int N=3)const;
protected:
  quiz_content qc;
  QApplication* pa;
  MainWindow* pw;
};

quiz::quiz(int& argc, char** argv, const char* file):qc(file){
// starting Application with Welcome Window
pa=new QApplication(argc, argv);
pw=new MainWindow();
pw->show();
pa->exec();}


class MainWindow : public QMainWindow{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
QLabel* qlf, *qls;
QVector<QCheckBox*> qla;
QButtonGroup* qba;};

MainWindow::MainWindow( QWidget *parent): QMainWindow(parent),qla(3)
{ // Welcome Wondow with checkboxes for desired level of game...
// everything works fine, but...
// to start quiz with desired level: can method from quiz be a slot for  MainWindow?
// and if so, how will it be mentioned properly?
connect(qba,SIGNAL(buttonClicked(int)), this, SLOT(quiz::play(int)));
...}`

NEXT在主要方面使用QApplication反过来尝试:

class quiz{
public:
quiz(const char* file);
// how can method play of element q influence the other elements of the 
// MainWindow Object for displaying text, etc.?
void play(int N=3)const;
protected:
quiz_content qc;};

class MainWindow : public QMainWindow{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
QLabel* qlf, *qls;
QVector<QCheckBox*> qla;
QButtonGroup* qba;
quiz q;};

2 个答案:

答案 0 :(得分:1)

谢谢,墨菲,你完全理解:-)

我会追求你在上一节中提出的建议。但是,这意味着quiz必须更加模块化。 quiz::play必须提供quizQString quiz::nextQuestion()等方法,而不是一个统治整个游戏的大方法unsigned int quiz::updateScore()

所以我的结论是:

  • 如果我想开发稍后将使用GUI功能的代码, 已经将它作为控制台应用程序实现时我必须考虑 关于适合与GUI交换信息的模块 (多个)对象。
  • 逻辑是GUI对象的一部分,反之亦然。

我对在论坛上发布的第一个问题做出的众多直接和有益的反应给我留下了深刻的印象。谢谢!

答案 1 :(得分:0)

我不确定我完全理解你的方法和你的问题,但我会尝试一下。不幸的是,您的代码示例还远未完成,但我会关注更大的图像。我只是想知道你到目前为止构建的内容是否适用,因为我错过了main()以及其他一些事情。

如上所述,GUI是面向事件的(事件通常但并不总是由用户触发),并且通常UI类占据控制用户交互的中心位置和功能:用户看到的内容和她的内容可以做。如果我正确理解您的体系结构,那么类quiz就是我所谓的业务逻辑,其中包含正在进行的测验的当前状态,并实现操作如何操纵存储的数据,从而影响哪些信息UI在给定时间提供的可能性。简单的应用程序在UI类中实现业务逻辑,但将逻辑移动到从UI类调用的单独的类/模块中确实是一种好习惯。

输入Qt:在main()中,您通常实例化QApplication并且主窗口QApplication::exec()控制Qt的事件循环,这使得窗口可以监听用户交互和处理事件。 E. g。按下按钮会调用连接的插槽(除了对事件做出相应反应的方法之外别无其他)。因此,您有一个主窗口对象处理用户交互,以及一些业务逻辑来进行计算并告诉UI接下来要显示什么。

现在回到你的具体问题,据我所知:你的第二次尝试似乎更接近于上面概述的体系结构以及我在第一次尝试时应用的内容:实例化一个包含业务实例的主窗口对象成员变量中的逻辑,调用其方法来触发测验的进度,并使用返回值来控制UI为用户提供的内容。