2015-10-14 109 views
0

我有以下问题。我想浪费尽可能少的内存,因此每当我加载另一个QWidget时,都会删除底层的QWidget。例如。我有几个内容,我想通过按下按钮在它们之间切换。如何在QStack中正确添加QWidgets?

所以我试图创建一个QStack,并添加QWidgets,只要有适当的按钮点击。同时我试图删除以前不再显示的小部件。

/*header file*/ 
#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QStack> 

namespace Ui 
{ 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); //Konstruktor 
    ~MainWindow(); //Destruktor 

    QStack<QWidget> *widgetStack; 

private: 
    Ui::MainWindow *ui; 

private slots: 
    void on_clickToProceedButton_clicked(); 
    void on_Rand_Taster_Anmeldung_clicked(); 
    void on_Rand_Taster_Anael_clicked(); 
    void on_Rand_Taster_Power_clicked(); 
}; 

#endif 

/*cpp file*/ 
#include "headerFiles/mainwindow.h" 
#include "ui_mainwindow.h" 
#include "headerFiles/authentication.h" 


MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent), ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    widgetStack = new QStack<QWidget>(); 
    widgetStack->push(ui->clickToProceedButton); 
} 

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

void MainWindow::on_clickToProceedButton_clicked() 
{ 
    Authentication *auth = new Authentication(this); 
    ui->verticalLayout->addWidget(auth); 
    ui->verticalLayout->removeWidget(widgetStack->pop()); 
    widgetStack->push(auth); 

} 

/*header file, rest of the code is not important, just that it is a QWidget*/ 
class Authentication : public QWidget 

当我运行此程序,它说,“有一个调用“QStack ::推(QPushButton *)没有匹配功能;”

QPushButton从QWidget继承,所以我只能猜测我应该用什么类似于java中的东西作为泛型类型参数的问题。

我在这个主题上搜索了一下,发现这个Is there equivalent of <? extends T> <? super T> in c++?说有一种方法可以像这样为泛型类型参数实现一个函数,但是我看不到如何将它应用到我的代码中。

我也发现类QStackedWidget,但这是我不想使用这种方法,我只能隐藏小部件,但不能删除它们。我真的想要节省内存,并且不要在qstackedwidget上加载所有内容。 我是新来的c + +和Qt。请帮帮我。提前致谢

+4

你可能想'QStack widgetStack;'而不是'QStack * widgetStack;' – Rostislav

回答

0

您试图将QWidget *添加到QStack堆栈。

你可以重构你的

QStack<QWidget> *widgetStack; 

QStack<QWidget*> *widgetStack; 

这应该更好地工作

+1

谢谢,这真的有效! – Greenfish

+0

这不是正确的解决方案,因此downvote,看到我的答案... – dhaumann

+0

阅读作者说什么:“我也找到了类QStackedWidget,但这是我不想用这种方法,我只能隐藏小部件但不删除它们,我真的想要保存内存,并且不要将所有东西都加载到qstackedwidget上。“ –

1

QStack不是你想要的。相反,看看QStackedWidgetQStackedLayout。您可以在相关链接的“详细说明”部分找到详细信息。

+0

@ GreenFish你应该真的考虑这个。有一个专门针对你在API中做什么的类,为什么不使用它? – undu