【问题标题】:Switching between windows. Qt Widgets ( 1 widget in memory )在窗口之间切换。 Qt 小部件(内存中的 1 个小部件)
【发布时间】:2017-11-05 22:24:43
【问题描述】:

例如,我有 2 个小部件,我在第一个小部件上按下按钮。我需要删除第一个小部件并创建新的小部件。 这怎么可能?我的意思是一些结构。我使用了stackedwidgets,但来自stackedwidgets 的页面位于内存中。我需要避免这种情况。

void Window::on_registrationButton_clicked(){
    ui->logWindow->hide();
    ui->RegistrWindow->show();
}

【问题讨论】:

  • 这个结构什么的
  • 显示您的代码,此类问题不适合。您必须提供Minimal, Complete, and Verifiable example。我还建议您阅读以下链接的内容以提高您的问题质量:How do I ask a good question?
  • 什么是weedget
  • 我读过这个。我无法理解你。我有代码女巫stackedwidgets,我可以在页面之间进行sweeticing,但是这些页面存储在内存中。我问如何避免这种情况。
  • 我知道删除小部件。但是我需要在预置按钮时创建新的小部件。我不知道怎么做。

标签: c++ qt c++14 qtwidgets


【解决方案1】:

当您要消除对象时,您不能在该对象所属的同一类中执行此操作,您必须在它之外执行此操作,例如在以下代码中,我创建了一个信号,该信号在按钮时触发按下时,我已将它连接到一个 lambda 函数,在该函数中创建新对象并消除发出它的对象。

class LogWindow: public QWidget{
    Q_OBJECT
public:
    LogWindow(const QString &text, QWidget *parent=Q_NULLPTR):QWidget(parent){
        setLayout(new QVBoxLayout);
        btn = new QPushButton(text, this);
        layout()->addWidget(btn);
        connect(btn, &QPushButton::clicked, this, &LogWindow::customSignal);
    }
signals:
    void customSignal();
private:
    QPushButton *btn;
};

class RegWindow : public QWidget{
    [...]
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    LogWindow *log= new LogWindow("LogWindow");
    RegWindow *reg;
    QObject::connect(log, &LogWindow::customSignal, [&reg, &log](){
        reg = new RegWindow("RegWindow");
        reg->show();
        log->deleteLater();
    });
    log->show();
    return a.exec();
}

#include "main.moc"

完整的例子可以看下面link

【讨论】:

  • 当您要消除该对象时,您不能在该对象所属的同一类中执行此操作 为什么不呢?使用 Qt::WA_DeleteOnClose 属性集,小部件可以调用自己的关闭方法,本质上是删除自己。
  • @scopchanov 根据我从文档中了解到的是,在 QCloseEvent 中接受事件后,对象将被删除,它并不表示它会在类内,只是它会在后来被淘汰。它可以表明他的肯定的证据。另外我想说的是,当你要创建一个新窗口时,它不应该在要被删除的类中。
  • 看看that,告诉我你的想法。
  • @scopchanov 我理解你的意思,我的话不准确,我的意思是window2不应该是window1中类的属性。你的代码很优雅。 :P
  • 感谢您的夸奖!我很感激。但是让我要求自己澄清一下(因为我也在学习)。您的意思是窗口(或小部件)2 不应该是小部件 1 的父级,因为在这种情况下,小部件 2 将与窗口 1 一起被删除?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2022-12-14
  • 2021-01-14
相关资源
最近更新 更多