无法从QMdiSubWindow转换QMainWindow

时间:2011-09-09 01:06:37

标签: qt casting mdi

所以我有一个程序,它使用QMainWindow的子类作为QMdiArea小部件。我只是这样做,因为QDockWidgets只能在QMainWindow中使用(我的子类需要dock小部件)。

为了节省目的,我正在测试我的类的序列化,而且我的指针不正确。这是代码

    if (ui->mdiMain->subWindowList().length() > 0)
    {
        QString path = QFileDialog::getSaveFileName(this, "Save Build Order", "" ,"*.cbo");

        if (path > 0)
        {
            QFile file(path, this);
            if (file.open(QFile::WriteOnly) == true)
            {
                QWidget* widget = reinterpret_cast<QWidget*>(ui->mdiMain->activeSubWindow());
                WidgetBuildOrder* widgetBuildOrder = reinterpret_cast<WidgetBuildOrder*>(widget);

                QDataStream stream(&file);
                stream << widgetBuildOrder;

                file.close();
                ui->statusBar->showMessage("Save Successful.", 5000);
            }
        }

    }
}

WidgetBuildOrder是MainWindow的子类。

所以我的想法是我可以继续指向它实际上是什么。当我创建MDI区域时,我传递了一个新的WidgetBuildOrder。有没有办法做到这一点?

要澄清,在演员之后我会得到一个指针,它只是指向垃圾。不是WidgetBuildOrder中设置的值我实际上已打开。

任何帮助将不胜感激,

谢谢,

JEC

2 个答案:

答案 0 :(得分:1)

QMdiArea::activeSubWindow会返回QMdiSubWindow*,如果QMdiArea没有焦点,则返回0。

由于您不可能拥有一个继承自QMainWindowQMdiSubWindow的类,您想要的是在当前子窗口中获取小部件:< / p>

QMdiSubWindow *subWindow = ui->mdiMain->currentSubWindow();
WidgetBuildOrder* widgetBuildOrder = 
    static_cast<WidgetBuildOrder*>(subwindow->widget());

答案 1 :(得分:0)

您是否尝试过不给WidgetBuildOrder指针指向QWidget但使用activatedSubWindow来获取正确的对象?

类似的东西:

//QWidget* widget = reinterpret_cast<QWidget*>(ui->mdiMain->activeSubWindow());
WidgetBuildOrder* widgetBuildOrder = reinterpret_cast<WidgetBuildOrder*>(ui->mdiMain->activeSubWindow());