2015-06-30 75 views
0

我有一個QGraphicsView子類,在項目的上下文菜單上,我想顯示一個屬性對話框。如何在QGraphicsView的中心顯示QDialog?

我想在視圖中居中對話框......

正如我現在,沒有父,它在屏幕中央顯示。

MyView::MyView(QWidget *parent) : QGraphicsView(parent) {} 

void MyView::showProperties() 
{ 
    TabDialog *tabDialog = new TabDialog(); // shows in center of screen 
// TabDialog *tabDialog = new TabDialog(this); // doesn't show at all 
// TabDialog *tabDialog = new TabDialog((QWidget*)this->parent()); // doesn't show at all 
    tabDialog->setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint); 
    tabDialog->exec(); 
    delete tabDialog; 
} 

視圖被放置在一個組框...所以父是組框...

怎麼能叫我用父母的對話?

回答

0

您必須將對話框設置爲頂級窗口,而不是簡單地將嵌入視圖中的子窗口小部件。您的setWindowsFlags調用將重置對話框中的相關標誌。您需要手動保存它們。

您也不應該使用exec()重新進入事件循環,因爲這需要您的其他許多代碼也需要重新進入。

一個最小的解決將是這樣的:

void MyView::showProperties() 
{ 
    auto dialog = new TabDialog(this); 
    dialog->setWindowFlags(Qt::Dialog | 
         Qt::WindowCloseButtonHint | 
         Qt::WindowSystemMenuHint); 
    dialog->setAttribute(Qt::WA_DeleteOnClose); 
    dialog->show(); 
} 

也許你希望緩存對話框:

class MyView : public ... { 
    QPointer<TabDialog> m_tabDialog; // nulls itself when the dialog perishes 
    QTimer m_tabDialogTimer; 
    ... 
}; 

MyView::MyView(...) { 
    m_tabDialogTimer->setSingleShot(true); 
    ... 
}  

void MyView::showProperties() { 
    if (! m_tabDialog) { 
    m_tabDialog = new TabDialog(this); 
    m_tabDialog->setWindowFlags(Qt::Dialog | 
           Qt::WindowCloseButtonHint | 
           Qt::WindowSystemMenuHint); 
    QObject::connect(&m_tabDialogTimer, &QTimer::timeout, 
        m_tabDialog, &QObject::deleteLater); 
    QObject::connect(m_tabDialog, &QDialog::finished, [&this](int){ 
     // the dialog gets deleted 120 seconds after last use 
     m_tabDialogTimer.start(120); 
    }); 
    } 
    m_tabDialogTimer.stop(); // reset pending timeout, if any 
    m_tabDialog->show(); 
} 
+0

隨着這一變化,我的窗口仍然會顯示在窗口的中心,不在QGraphicsView之上。 – Thalia

+0

@Thalia這是預期的行爲。如果您希望將它精確地顯示在頂層窗口的子窗口小部件的中心,就像我現在假定的那樣,您需要手動進行定位。但請注意,模態對話在不同平臺上的行爲不同,因此您的位置選擇可能不合適或被忽略。例如,在Mac上,模式對話框顯示爲從窗口的標題欄放下的工作表 - 因此,您希望將其放在其他位置並不重要,它對於平臺來說看起來不太合適,並且默認情況下您的定位選擇被忽略。 –

+0

@Thalia對話框的手動定位不是微不足道的,除非對話框的大小是固定的,因爲在顯示對話框的大小之前,對話框的大小是未知的,所以一旦事件循環處理完所有與事件相關的事件,就需要激活定位代碼到對話的可見性變化。這裏的確切行爲恐怕會非常依賴於平臺,所以這是否值得嘗試。您一定想在您定位的所有平臺上進行測試。 –