切换不同的屏幕

时间:2013-12-02 15:24:52

标签: c++ qt

我有一个带有几个屏幕的应用程序,我想在应用程序启动时加载,并在程序运行时保留在内存中。我希望能够在按钮单击时在屏幕之间切换,在显示下一个屏幕时隐藏当前屏幕。通过应用程序没有直接路径,用户可以在应用程序中的屏幕上来回切换。我正在使用Qt和新的c ++。

以下是我想要开始工作的骨架代码(或者获得有关更好方法的建议)。我这样做是为了避免在多次反复移动应用程序时创建对话框的新实例时发生内存泄漏。

当我编译它时,我得到一个错误未定义参考Screen2中的'Screen2' - > show();在dialog1.cpp中的Dialog1 :: on_pushButton_clicked()中。我尽了一切努力让这个编译没有成功。为什么Screen2不是dialog1.cpp中的有效指针?

我有一个从Main运行的Manager并初始化对话框。

manager.cpp:

#include "manager.h"
#include "ui_manager.h"

Manager::Manager(QWidget *parent) :
QDialog(parent),
ui(new Ui::Manager)
{
    ui->setupUi(this);
    Screen1 = new Dialog1(this);
    Screen2 = new Dialog2(this);
    Screen1->show();
}

Manager::~Manager()
{
    delete ui;
}

manager.h:

#ifndef MANAGER_H
#define MANAGER_H
#include <QDialog>
#include "dialog1.h"
#include "dialog2.h"

namespace Ui {
    class Manager;
}

class Manager : public QDialog
{
    Q_OBJECT

public:
    explicit Manager(QWidget *parent = 0);
    ~Manager();

    Dialog1 *Screen1;
    Dialog2 *Screen2;

private:
    Ui::Manager *ui;
};

#endif // MANAGER_H

dialog1.cpp:

#include "dialog1.h"
#include "ui_dialog1.h"
#include "manager.h"
#include "dialog2.h"
#include <QDebug>

extern Dialog1 *Screen1;
extern Dialog2 *Screen2;

Dialog1::Dialog1(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog1)
{
    ui->setupUi(this);
}

Dialog1::~Dialog1()
{
    delete ui;
}

void Dialog1::on_pushButton_clicked()
{
    Screen2->show();
}

dialog1.h:

#ifndef DIALOG1_H
#define DIALOG1_H

#include <QDialog>
#include "dialog2.h"

class Manager;

namespace Ui {
    class Dialog1;
}

class Dialog1 : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog1(QWidget *parent = 0);
    ~Dialog1();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Dialog1 *ui;
};

#endif // DIALOG1_H

dialog2.cpp:

#include "dialog2.h"
#include "ui_dialog2.h"
#include "dialog1.h"
#include "manager.h"

extern Dialog1 *Screen1;
extern Dialog2 *Screen2;

Dialog2::Dialog2(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog2)
{
    ui->setupUi(this);
}

Dialog2::~Dialog2()
{
    delete ui;
}

void Dialog2::on_pushButton_clicked()
{
    Screen1->show();
}

所有帮助表示赞赏!

此致 詹姆斯

1 个答案:

答案 0 :(得分:0)

我将向您解释最简单的方法。

  1. 使screen1和screen2成为经理类的私人成员。
  2. 将信号buttonPressed()添加到两个屏幕。
  3. 在每个对话框中按下按钮发出信号。
  4. 在经理类中添加插槽以处理对话框中的按钮
  5. 将对话框的信号连接到管理器插槽
  6. 在两个对话框中删除它:

    extern Dialog1 *Screen1;
    extern Dialog2 *Screen2;
    
  7. 您无法直接访问它们,因为您是经理对象的成员。

    因此,您可以根据需要添加任意数量的屏幕。每个屏幕都不会对其他屏幕有所了解(您试图这样做)。