2013-10-20 44 views
1

我的第一個Qt窗口上有一個按鈕。當按鈕被點擊時,當前窗口的UI應該改變爲不同的UI文件。現在,當我點擊按鈕時,會打開一個新窗口,但舊窗口仍然打開。 有沒有辦法用不同的內容替換當前窗口的內容?或者更好地打開另一個窗口並銷燬第一個窗口?在按鈕上點擊顯示另一個ui文件

MainWindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 


void MainWindow::on_pushButton_clicked() 
{ 
    otherWindow = new OtherWindow(); 
    otherWindow->show(); 
} 
+0

這似乎有點乏味。實現類似的一種方法是將另一個窗口放在第一個窗口上。這完全取決於您的工作流程。面對類似的問題 - 但更多的選擇,我選擇了一個標記對話框。 – ExpatEgghead

+2

如何使用按鈕切換到堆棧中的其他小部件的堆疊小部件? – drescherjm

+1

看來[QStackedWidget](http://qt-project.org/doc/qt-5.0/qtwidgets/qstackedwidget.html)是你需要的。 – thuga

回答

0

這在理論上是可能與另一個替換一個UI。

您將需要遵循以下步驟:

  1. 消滅所有子對象由第一UI在構造
  2. 上創建新創建新的用戶界面的一個實例
  3. 運行setupUi(this) UI

正如我所說的,這是理論上的。儘管你的UI類必須從相同的基類派生,並且與第一個UI相關的所有插槽在連接到新的UI時可能會出現奇怪的行爲,但這遠非實際。

我能建議的是你遵循Model-View-Controller (MVC)的設計模式。這裏有一個建議,其他人可能會有更好的。

  1. 創建一個派生類QWidget作爲您的Controller類。設計將處理由View生成的所有用戶事件的所有信號和插槽。
  2. 在QtDesigner中設計UI,並使其成爲您的Controller類的私人成員。讓我們在Controller類的構造函數中構建所有的UI元素,然後連接所有的信號和插槽。這將在設計模式中起到View的作用。
  3. 如果您需要一些持久性數據,請創建一個班級或班級集合以充當Model,或者將其中一個班級傳遞給您的Controller班級。使用此設置在您的View用戶界面中設置子窗口小部件的所有值。
  4. Controller QWidget傳遞給QMainWindow函數setCentralWidget()將其設置爲用戶可以看到的UI。
  5. 爲您可能需要的每個不同用戶界面重複步驟1-4。
  6. 當您需要更換用戶界面時,只需使用setCentralWidget()QMainWindow)更改爲相應的用戶界面。
相關問題