【问题标题】:Using QMDIArea with Qt 4.4.在 Qt 4.4 中使用 QMDIArea。
【发布时间】:2010-09-23 20:03:59
【问题描述】:

我在 Qt 4.4 中使用QMdiArea

如果创建了一个新项目,我会在QMdiArea 中添加一些子窗口。我想禁止用户在运行时关闭子窗口。只有关闭整个应用程序或创建新项目时,才应关闭子窗口。

我该怎么做?

【问题讨论】:

  • 您能否继承 QMdiArea 并覆盖默认的 closeActiveSubWindow/closeAllSubWindows 方法以在用户请求时不关闭窗口?

标签: c++ qt user-interface qt4 qmdiarea


【解决方案1】:

您需要定义自己的subWindow。创建QMdiSubWindow 的子类并覆盖closeEvent(QCloseEvent *closeEvent)。你可以通过参数来控制它。例如:

void ChildWindow::closeEvent(QCloseEvent *closeEvent)
{
  if(/*condition C*/)
    closeEvent->accept();
  else
   closeEvent->ignore(); // you can do something else, like 
                         // writing a string in status bar ...
}

然后继承QMdiArea 并像这样覆盖QMdiArea::closeAllSubWindows ()

class MainWindowArea : public QMdiArea
{
    Q_OBJECT
public:
    explicit MainWindowArea(QWidget *parent = 0);

signals:
    void closeAllSubWindows();
public slots:

};
// Implementation:
MainWindowArea::closeAllSubWindows()
{
    // set close condition (new project is creating, C = true)
    foreach(QMdiSubWindow* sub,this->subWindowList())
    {
        (qobject_cast<ChildWindow*>(sub))->close();
    }
} 

您可能还需要覆盖 mdi 区域的 close 插槽。

【讨论】:

  • 是的,这是一种可能性。它不会删除右上角的“x”,但可以正常工作。实际上我正在寻找一个解决方案,虽然也删除了这个“x”。
  • 也许你可以通过重新实现 mdiArea 的绘制事件来克服......但这很难。
【解决方案2】:

您可以执行与顶级窗口相同的操作:处理并忽略它发送的 QCloseEvent。 QMdiArea::closeActiveSubWindow/QMdiArea::closeAllSubWindows 只需调用 QWidget::close,它会发送一个 closeEvent 并在继续之前确认它已被接受。

您可以通过继承 QMdiSubWindow 并重新实现 QWidget::closeEvent 来处理此事件,或者使用事件过滤器来拦截它。..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多