我如何在 C++ 的堆栈上正确添加 QTWidgets?
how do i add QWidgets properly on a QStack in c++?
我有以下问题。我想尽可能少地浪费内存,因此每当我在它上面加载另一个 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
当我 运行 这个程序时它说 "there is no matching function for call to 'QStack::push(QPushButton*);"
QPushButton 继承自 QWidget,所以我只能猜测我应该使用类似于 java 的东西作为通用类型参数的问题。
我在谷歌上搜索了这个主题,发现 Is there equivalent of <? extends T> <? super T> in c++? 说有一种方法可以像这样为泛型类型参数实现一个函数,但我不知道如何将它应用到我的代码中。
我还找到了 class QStackedWidget,但这是我不想使用的,因为使用这种方法我只能隐藏小部件而不能删除它们。我真的很想节省内存,不要在 qstackedwidget 上加载所有内容。
我是 c++ 和 Qt 的新手。请帮我。提前致谢
QStack 不是您想要的。相反,看看 QStackedWidget and QStackedLayout。您可以在参考链接的 "Detailed Description" 部分中找到详细信息。
您正在尝试将 QWidget* 添加到 QStack 堆栈。
您可以重构您的
QStack<QWidget> *widgetStack;
进入
QStack<QWidget*> *widgetStack;
这应该会更好
我有以下问题。我想尽可能少地浪费内存,因此每当我在它上面加载另一个 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
当我 运行 这个程序时它说 "there is no matching function for call to 'QStack::push(QPushButton*);"
QPushButton 继承自 QWidget,所以我只能猜测我应该使用类似于 java 的东西作为通用类型参数的问题。
我在谷歌上搜索了这个主题,发现 Is there equivalent of <? extends T> <? super T> in c++? 说有一种方法可以像这样为泛型类型参数实现一个函数,但我不知道如何将它应用到我的代码中。
我还找到了 class QStackedWidget,但这是我不想使用的,因为使用这种方法我只能隐藏小部件而不能删除它们。我真的很想节省内存,不要在 qstackedwidget 上加载所有内容。 我是 c++ 和 Qt 的新手。请帮我。提前致谢
QStack 不是您想要的。相反,看看 QStackedWidget and QStackedLayout。您可以在参考链接的 "Detailed Description" 部分中找到详细信息。
您正在尝试将 QWidget* 添加到 QStack 堆栈。
您可以重构您的
QStack<QWidget> *widgetStack;
进入
QStack<QWidget*> *widgetStack;
这应该会更好