2013-07-22 56 views
0

嗨我想在Qt中做一個簡單的佈局,首先佈局不能正常工作,所有顯示的是取消按鈕。所以我一直在亂搞,現在當我運行它時,它運行沒有錯誤,但沒有窗口彈出,不知道我可以做什麼來造成這種情況?這裏是我的代碼Qt程序不顯示

#ifndef FILMINPUT_H 
#define FILMINPUT_H 

#include <QMainWindow> 
#include "Film.h" 
#include "FilmWriter.h" 
#include <QLabel> 
#include <QTextEdit> 
#include <QPushButton> 

namespace Ui { 
    class FilmInput; 
} 

class FilmInput : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit FilmInput(QWidget *parent = 0); 
    ~FilmInput(); 

private: 
    Ui::FilmInput *ui; 
    //widgets 
    QMainWindow* window; 
    QMenuBar* menubar; 
    QLabel* infoLabel; 
    QLabel* titleLabel; 
    QLabel* durationLabel; 
    QLabel* directorLabel; 
    QLabel* relDateLabel; 
    QTextEdit* titleEdit; 
    QTextEdit* durationEdit; 
    QTextEdit* directorEdit; 
    QTextEdit* relDateEdit; 
    QPushButton* saveBtn; 
    QPushButton* cancelBtn; 
    Film f; 
    //sets up gui and connects signals and slots 
    void setUpGui(); 
}; 

#endif // FILMINPUT_H 

#include "filminput.h" 
#include "ui_filminput.h" 
#include <QtGui> 


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

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

void FilmInput::setUpGui(){ 
    //initialise widgets 
    infoLabel = new QLabel("Please enter film data which will be saved to a file",this); 
    titleLabel = new QLabel("Film Title",this); 
    durationLabel = new QLabel("Film Duration",this); 
    directorLabel = new QLabel("Film Director",this); 
    relDateLabel = new QLabel("Film Release Date",this); 
    titleEdit = new QTextEdit(this); 
    durationEdit = new QTextEdit(this); 
    directorEdit = new QTextEdit(this); 
    relDateEdit = new QTextEdit(this); 
    saveBtn = new QPushButton("Save Film",this); 
    cancelBtn = new QPushButton("Cancel",this); 
    //set layout 
    QVBoxLayout* layout = new QVBoxLayout(); 
    layout->setMenuBar(menubar); 
    layout->addWidget(infoLabel); 
    layout->addWidget(titleLabel); 
    layout->addWidget(durationLabel); 
    layout->addWidget(directorLabel); 
    layout->addWidget(relDateLabel); 
    layout->addWidget(titleEdit); 
    layout->addWidget(durationEdit); 
    layout->addWidget(directorEdit); 
    layout->addWidget(relDateEdit); 
    layout->addWidget(saveBtn); 
    layout->addWidget(cancelBtn); 

    this->setLayout(layout); 
    this->setWindowTitle("Film Archive"); 
} 

#include <QtGui/QApplication> 
#include "filminput.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    FilmInput w; 
    w.show(); 

    return a.exec(); 
} 

回答

4

看起來你在這裏有衝突的事情。 你有Qt的所見即所得的編輯器窗口小部件(QtDesigner),你告訴Qt來初始化(ui->setupUi(this)):

#include "ui_filminput.h" //<---- Generated from the QtDesigner form 

FilmInput::FilmInput(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::FilmInput) //<---- Creating the struct that holds of the widget pointers. 
{ 
    ui->setupUi(this); //<---- Telling Qt to setup and layout all the QtDesigner widgets from this designer form. 
    //setUpGui(); <--- Where your layouts and widgets are accidentally clashing with the form's widgets. 
} 

那麼你也有你手動創建內部setUpGui()的人。將QtDesigner表單與手動創建的小部件混合在一起很好 - 我一直都在做。但是,你不小心從事的是你不小心設置佈局:

this->setLayout(layout); 

在這個主窗口....其中QtDesigner形式已經做了窗口小部件,覆蓋它們,並可能混淆的佈局主窗口。

您可以完全移除QtDesigner小部件,或者通過在主窗口的子小部件上設置佈局來使它們良好地交互。

您可以通過'ui'成員變量訪問QtDesigner小部件。

this->ui->someNameOfWidgetInQtDesigner 

我相信主窗口中有一個名爲「centralWidget」在QtDesigner已經創建了一個小部件,或類似的東西(開拓FilmInput.ui和檢查實際的命名)。 所以你應該設置你的佈局,假設你還沒有在QtDesigner中創建佈局。

this->ui->centralWidget->setLayout(layout); 

如果您QtDesigner形式(FilmInput.ui)已經有一個佈局在centralWidget設置,添加一個新的QWidget在設計形式爲centralWidget的centralWidget的佈局兒童,並將其命名爲類似「側面板」或無論有什麼意義,然後做:

this->ui->sidePanel->setLayout(layout); 
+0

非常感謝您的幫助,我應該在哪裏調用setUpGui函數,現在它與ui-> setupui衝突? – Dmon

+0

您可以聲明它的位置,但由於FilmInput已經爲其設置了佈局,因此您需要將佈局設置爲FilmInput的子部件的新部件,以便它們可以一起交互。在QtDesigner中,向FilmInput添加一個小部件(如果那裏沒有空的部件),並在setUpGui()中使用該新小部件來設置您的佈局。 –

+0

我得到一個退出的代碼-1073741819我添加了一個小部件,只是將名稱作爲小部件,然後將代碼更改爲this-> ui-> widget-> setLayout(layout);我認爲問題出在FilmInput :: FilmInput(QWidget * parent): QMainWindow(parent), ui(new Ui :: FilmInput) { ui-> setupUi(this); setUpGui(); } – Dmon