2013-05-31 39 views
-1

我正在以編程方式構建QT中的UI。問題是當製作Qframe,設置爲佈局並將佈局添加到我的主窗口時,該框架變成它自己的窗口。我搜索了四周,但似乎無法讓它成爲我的主窗口中的框架。Qt QFrame變成獨立窗口

MainWindow::MainWindow() 
    { 

     QWidget::showMaximized(); 
     frame = new QFrame(); 
     layout = new QHBoxLayout(); 
     button = new QPushButton("Push"); 

     layout->addWidget(frame); 
     frame->show(); 
     this->setLayout(layout); 

     Setstyles(); 
    } 
+0

你是什麼意思「成爲我的主窗口內的框架」?你的意思是把它設置爲中心部件? – cmannett85

回答

2

的問題是,QFrame從QWidget的繼承,如果沒有父母,這是要創建一個窗口。

QWidget:details section

每個部件的構造函數接受一個或兩個標準參數:

  1. QWidget的*父= 0是新的窗口小部件的父。如果它是0(默認值),那麼新的小部件將是一個窗口。如果不是,它將是父級的孩子,並受到父級幾何的約束(除非你指定Qt :: Window作爲窗口標誌)。

要解決您的具體情況,與家長建立QFrame對象:

frame = new QFrame(this); 
+0

謝謝,所以向佈局添加小部件不會自動定義ui層次結構? – internetmw

+0

@internetmw不,將小部件對象添加到佈局中不會重置它們 –

+3

https://qt-project.org/doc/qt-4.8/qlayout.html#addItem是的它是:「注意:item的所有權是轉移到佈局,並且佈局有責任將其刪除。「 – cmannett85

0

你不能設置一個QMainWindow(或簡單的子類)的佈局,可以只設置它的中央物件。我假設你的MainWindowQMainWindow的一個子類。但你當然可以將佈局設置爲該中心部件,所以你可以這樣做:

MainWindow::MainWindow() // parent will be nullptr, so this will be a window 
{ 
    showMaximized(); 

    // create and set central widget 
    QWidget *cw = new QWidget(); 
    setCentralWidget(cw); // will set cw's parent 
    // Note: there's no need to make cw a member variable, because 
    // MainWindow::centralWidget() gives direct access to it 

    frame = new QFrame(); 
    layout = new QHBoxLayout(); 
    button = new QPushButton("Push"); // this is not used at all? why is it here? 

    layout->addWidget(frame); 
    //frame->show(); // not needed, child widgets are shown automatically 
    cw->setLayout(layout); // will set parent of all items in the layout 

    Setstyles(); 
}