如何在c++的QStack上正确添加QWidgets ?

how do i add QWidgets properly on a QStack in c++?

本文关键字:添加 QWidgets QStack c++      更新时间:2023-10-16

我有以下问题。我希望尽可能少地浪费内存,因此每当我在其上加载另一个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中的泛型类型参数。

我在谷歌上搜索了这个话题,发现了这个是否有等效的在c++中?说有一种方法可以实现像这样的泛型类型参数的函数,但我不知道如何将其应用到我的代码中。

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

QStack不是你想要的。相反,看看QStackedWidget和QStackedLayout。您可以在链接的"详细说明"部分找到详细信息。

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

你可以重构

QStack<QWidget> *widgetStack;

QStack<QWidget*> *widgetStack;

这个应该会更好