2012-04-17 29 views
0

我正在開發一個使用Qt4的項目,我遇到了一個小問題。 我從主窗口創建模態窗口。我希望這可以禁用頂部的工具欄。 我有一個菜單項,從菜單中產生模式。我想要的是,當模式產生的菜單被禁用。我曾嘗試使用setEnabled(false)函數,但不重置它。QT模式窗口和禁用父母工具欄

下面是代碼:

void Main_Screen::Create_ViPro() 
{ 
    std::auto_ptr<ViPro_Dialog> modal(new ViPro_Dialog(this)); 
    modal->show(); 
    modal->exec(); 
} 

所以這僅僅是在選擇菜單項時觸發一個簡單的類。我覺得這個問題源於這樣一個事實,即我將父窗口設置爲主窗口,但是我不知道如何在沒有父窗口的情況下創建窗體(這樣做沒有意義)。有沒有辦法從孩子禁用家長工具欄?我迄今爲止唯一看到的是_fileMenu-> setEnabled(false); 只要我沒有創建模式,這種方法就可以工作,但只要產生了這個模式,菜單就會再次運行。我完全迷失了。 在此先感謝

編輯,帕特里斯

這裏是構造

Main_Screen::Main_Screen(QWidget* parent /*= NULL*/) 
         : QMainWindow(parent), 
          _newProj(new QAction(tr("New &ViPro"), this)), 
          _fileMenu(menuBar()->addMenu(tr("&File"))) 
{  
    //create slot for creating a new project 
    connect(_newProj.get(), SIGNAL(triggered()), this, SLOT(Create_ViPro())); 
    _fileMenu->addAction(_newProj.get()); 
    //if i do this then setEnabled(false) works perfectly and i can't access the menu 
    Create_ViPro() 
} 

所以該功能通過觸發newproject動作信號。如果我直接從構造函數中調用該函數,則會按照您所說的patrice禁用它,但是,如果我通過觸發器調用函數,則不會禁用它。我處理信號/插槽機制錯了嗎?再次感謝。

另一個例子,如果我做的函數create_vipro(),如下

void Main_Screen::Create_ViPro() 
{ 
    _fileMenu->setEnabled(false); 
} 

當我觸發事件的文件菜單沒有被禁用,所以它必須有無關的模式本身,而是而是如何處理信號。

+0

從哪個QT類是'Main_Screen'和'ViPro_Dialog'派生的? – bjhend 2012-04-17 00:47:31

+0

Main_Screen派生自QMainWindow,而ViPro_Dialog派生自QDialog – Bear 2012-04-17 16:58:12

回答

0

由於孩子是模態對話框,主屏幕無法對事件做出反應。但你可以在創建模態對話框前禁用工具欄(或菜單欄),一旦你離開exec函數啓用:

void Main_Screen::Create_ViPro() 
{ 
    _fileMenu->setEnabled(false); 

    std::auto_ptr<ViPro_Dialog> modal(new ViPro_Dialog(this)); 
    modal->show(); 
    modal->exec(); // Will stay here until you close the modal dialog 

    _fileMenu->setEnabled(true); 
} 

如果ViPro_Dialog確實是一個模式對話框它將作品。

另一件事,因爲ViPro_Dialog是形式上的,你可以在本地聲明它不使用的auto_ptr:

void Main_Screen::Create_ViPro() 
{ 
    _fileMenu->setEnabled(false); 

    ViPro_Dialog modal(this); 
    modal.show(); 
    modal.exec(); // Will stay here until you close the modal dialog 

    _fileMenu->setEnabled(true); 
} 

編輯:

我想(我不能在工作測試),您可以」在執行QAction時啓用/禁用菜單。信號依次調用插槽,因此當您嘗試禁用菜單時,QAction處於忙碌狀態。 試試這個:

  1. 在主屏幕上,使用一個布爾參數創建一個插槽,以啓用/禁用菜單欄。只是調用的setEnabled功能
  2. 在ViPro_Dialog,發出信號與布爾參數(假啓動時,真正的驗證)
  3. 在Create_ViPro,一旦對話產生的,該插槽,EXEC對話和Don連接新信號」噸忘記從信號斷開槽:

空隙Main_Screen :: Create_ViPro() { ViPro_Dialog模態(本);

//連接信號/槽

modal.show(); modal.exec(); //會留在這裏直到關閉模式對話框

//斷開信號/插槽 }

這可以實現你想要的

EDIT2

你是做了一個錯誤的時候使用模態對話框。 show()exec()之間有衝突。當你顯示模態對話框時,你不需要禁用其他窗口:它是通過對話框的模態狀態自動完成的。有很多模態深度:http://qt-project.org/doc/qt-4.8/qt.html#WindowModality-enum。所以,你的代碼應該是:

void Main_Screen::Create_ViPro() 
{ 
    ViPro_Dialog modal(this); 

    // modal.setWindowModality(Qt::WindowModal); // Uncomment this line if you want to only disable parent 

    modal.exec(); 
} 

閱讀更多的細節:http://qt-project.org/doc/qt-4.8/QDialog.html#details

+0

好吧,我不確定,我正在做一個教程,並且說它從來沒有在堆棧上分配,因爲它與一些析構函數混淆。無論如何,我試過這個解決方案,似乎有一個問題,當一個函數從信號/槽連接調用。如果我從構造函數中調用函數Create_ViPro,它可以很好地工作。只要我通過捕獲當我點擊菜單項時創建的信號來調用它,setEnabled不再起作用?我的理論是,它與使用工具欄生成信號有關,對此有任何想法? – Bear 2012-04-17 16:56:42

+0

你能提供一個代碼示例來看看它有什麼問題嗎? – 2012-04-17 19:12:01

+0

當然我會編輯我的帖子。 – Bear 2012-04-18 05:16:14

0

使用exec()不只是創建一個模式對話框,它也暫停大部分常規事件處理,並且只處理exec()對話框中的事件。這可能包括一些UI更新(例如從啓用到禁用的轉換),但我不積極。一個更好的方式來處理,這可能是明確設置對話框模式,但允許在定期事件循環繼續,這樣的事情:

void Main_Screen::Create_ViPro() 
{ 
    ViPro_Dialog* modal = new ViPro_Dialog(this); 
    modal->setModal(true); 
    modal->show(); 
} 

該代碼仍然不會在視覺上禁用工具欄或菜單欄,但他們應該沒有反應。要禁用它們,您可以嘗試將其與Patrice Bernassola's answer結合使用。