【问题标题】:Can't open Widget from the MainWindow无法从主窗口打开小部件
【发布时间】:2014-12-23 03:20:46
【问题描述】:

我想从我的 MainWindow 打开一个小部件。我认为这很容易做到,我阅读的所有教程都是这样的:

void MainWindow::on_pushButton_Types_clicked()
{
    m_typesWin = new TypesWindow(m_db, this);
    m_typesWin->show();
    this->hide();
}

但是,这仅适用于我不将“this”传递给构造函数的情况。当我将“this”添加到构造函数时,我看不到小部件,程序就停止了。如果我不隐藏“this”,那么我可以看到我的小部件的某些部分实际上在我的主窗口中。我不知道为什么。

编辑:这些类是由 QtCreator 自动创建的,所以它们应该没问题。

【问题讨论】:

  • 对不起。 m_db 是什么?顺便说一句,如果您没有看到您的小部件,请尝试在显示后添加 m_typesWin->raise();m_typesWin->activateWindow();
  • 您不应该将父窗口传递给顶级窗口。顶级窗口是没有父级的小部件。 (如果你想让 TypesWindow 成为顶级窗口,它不应该有另一个窗口作为父窗口)
  • @Lahiru Chandima:究竟什么是“顶级窗口”?
  • @Tay2510:m_db 是我在小部件中需要的对象。没什么重要的(我猜)。我尝试了 raise() 和 activateWindow() 但这没有帮助。小部件仍然消失,程序关闭。
  • 在 TypesWindow 构造函数中,只需不要将主窗口指针传递给 TypesWindow 的父类。将其存储在 TypesWindow 本身的指针中。

标签: c++ qt qwidget


【解决方案1】:

如果您希望 QWidget 显示为窗口,则不应为该小部件指定父小部件。在这里,因为您将主窗口指定为 TypesWindow 的父窗口,所以 TypesWindow 将嵌入到主窗口中。所以当你隐藏主窗口时,嵌入在主窗口中的 TypesWindow 也会被隐藏。

由于您希望 TypesWindow 是一个单独的窗口,因此不要将父窗口小部件传递给 TypesWindow 构造函数中的 QWidget 构造函数。如果要从 TypesWindow 访问主窗口,可以将主窗口指针存储在 TypesWindow 的指针字段中。

【讨论】:

  • 应该指定父窗口小部件。因为它将保持明确的指针拥有。正确的解决方案是设置Qt::Window(或Qt::Dialog)标志。
【解决方案2】:

从新的 Qwidget 打开主窗口:

1) 在 NEWWIDGET.CPP 中:

QWidget *w;

NEWWIDGET::NEWWIDGET(QWidget *parent,QWidget *win) :
  QWidget(parent),
  ui(new Ui::NEWWIDGET)
{
  ui->setupUi(this);
  w=win;
}

..

void NEWWIDGET::on_pushButton_clicked()
{
  this->hide();
  w->show();
}

2)在 NEWWIDGET.H

public:
    explicit NEWWIDGET(QWidget *parent=nullptr,QWidget *win=nullptr);
    ~NEWWIDGET();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多