2015-09-09 53 views
0

我嘗試使用OpenGL實現一個應用程序, ,如下面的示例所示,我使用QWindow創建OpenGL上下文。在QWindow中使用QFileDialog

http://doc.qt.io/qt-5/qtgui-openglwindow-example.html

在這個應用程序,我希望當我按下S鍵來創建一個文件對話框。 但是,QFileDialog::getSaveFileName要求QWidget的父項。 The documentation表示如果parent爲0,則對話框將顯示在父控件的中心。 我想知道在這種情況下 可以簡單地使用nullptr作爲parent

例子:

#include <QApplication> 
#include <QMainWindow> 
#include <QKeyEvent> 
#include <QDebug> 
#include <QFileDialog> 
#include <QtGui/QWindow> 

class DisplayWindow final : public QWindow 
{ 
    Q_OBJECT 

public: 
    DisplayWindow(QWindow* parent = 0) 
     : QWindow(parent) 
    { 
     // Setup OpenGL context 
     // ... 
    } 

protected: 
    virtual void keyPressEvent(QKeyEvent* event) override 
    { 
     if (event->key() == Qt::Key_S) 
     { 
      //           ??????? 
      QString path = QFileDialog::getSaveFileName(nullptr, "Save", "", ""); 
      qDebug() << path; 
     } 
    } 

}; 

class MainWindow final : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    MainWindow(QWidget *parent = 0) 
     : QMainWindow(parent) 
    { 
     displayWindow = new DisplayWindow; 
     auto* container = QWidget::createWindowContainer(displayWindow, this); 
     container->setMinimumSize(200, 200); 
     setCentralWidget(container); 
    } 

private: 
    DisplayWindow* displayWindow; 

}; 

int main(int argc, char** argv) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 
    return a.exec(); 
} 

#include "moc_test.cpp" 
+0

我不明白你的問題。醫生說你可以做到這一點,你可以嘗試自己看,但你仍然在這裏問一個問題。 – undu

+0

@undu重點是類型的差異。 DisplayWindow的父類型是QWindow,但QFileDialog :: getSaveFileName需要QWidget。我想知道在這種情況下,如文檔所述,使用nullptr是有效的。 – akarin64

回答

0

是的,它應該是安全的。既然你不動態分配內存,你不需要刪除任何東西。如果你設立了父母,Qt會自行刪除這些小部件。 在這裏它只是影響窗口的形式和位置。 如果你想設置一個家長,你可以在你的上下文中使用「this」。