2013-07-22 5 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

Похоже, у вас здесь конфликтующие вещи. Вы WYSIWYG виджет редактора в 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, либо, лучше всего, сделать их хорошо взаимодействующими, установив макет в подвиджет вашего основного окна.

Вы можете получить доступ к виджетам QtDesigner через переменную-член «ui».

this->ui->someNameOfWidgetInQtDesigner 

Я считаю, что главное окно имеет виджет уже созданный в QtDesigner под названием «centralWidget», или что-то подобное (открыть FilmInput.ui и проверить фактическое именование). Итак, вы должны установить свой макет на том основании, что вы еще не создали макет в QtDesigner.

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

Если ваша форма QtDesigner (FilmInput.ui) уже есть макет, установленный на centralWidget, добавить новый QWidget в виде конструктора, как ребенок из centralWidget в макете centralWidget, и название что-то вроде «Sidepanel» или что имеет смысл, а затем выполните следующие действия:

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

большое спасибо за помощь, где я должен теперь назвать функцию setUpGui, когда она сталкивается с ui-> setupui? – Dmon

+0

Вы можете объявить его там, где он есть, но поскольку у FilmInput уже установлен макет, вам нужно установить макет на новый виджет, который является дочерним элементом FilmInput, чтобы они могли взаимодействовать друг с другом. В QtDesigner добавьте виджет к FilmInput (если там еще нет пустого), а в setUpGui() используйте этот новый виджет для установки вашего макета. –

+0

Я получаю код с кодом -1073741819. Я добавил виджет, который просто оставил имя в виде виджета, а затем изменил код на это-> ui-> widget-> setLayout (layout); Я думаю, что проблема в FilmInput :: FilmInput (QWidget * parent): QMainWindow (родительский), ui (новый Ui :: FilmInput) { ui-> setupUi (this); setUpGui(); } – Dmon