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

所以我尝试创建一个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 :: push(QPushButton *);”。

QPushButton继承自QWidget,所以我只能猜测我应该使用与Java类似的东西作为泛型类型参数的问题。

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

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

最佳答案

您正在尝试将QWidget *添加到QStack堆栈。

您可以重构您的

QStack<QWidget> *widgetStack;


进入

QStack<QWidget*> *widgetStack;


这应该更好地工作

关于java - 如何在C++中的堆栈上正确添加小部件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33127116/

10-11 07:51