【问题标题】:how do i add QWidgets properly on a QStack in c++?如何在 C++ 中的堆栈上正确添加 QTWidgets?
【发布时间】:2015-10-14 13:46:09
【问题描述】:

我有以下问题。我想浪费尽可能少的内存,因此每当我在它上面加载另一个 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 的新手。请帮我。提前致谢

【问题讨论】:

  • 你可能想要QStack&lt;QWidget*&gt; widgetStack;而不是QStack&lt;QWidget&gt; *widgetStack;

标签: java c++ qt qwidget


【解决方案1】:

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

【讨论】:

  • @GreenFish 你真的应该考虑一下。有一个类专门用于您在 API 中尝试做的事情,为什么不使用它呢?
【解决方案2】:

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

你可以重构你的

QStack<QWidget> *widgetStack;

进入

QStack<QWidget*> *widgetStack;

这应该会更好

【讨论】:

  • 阅读作者所说的:“我还找到了 QStackedWidget 类,但我不想使用这种方法,因为我只能隐藏小部件但不能删除它们。我真的想保存内存,不要在 qstackedwidget 上加载所有内容。”
猜你喜欢
  • 2010-10-10
  • 2011-05-13
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多