2015-10-14 58 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