Qt程序不显示

时间:2013-07-22 18:45:11

标签: c++ 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();
}

1 个答案:

答案 0 :(得分:4)

看起来你在这里有相互矛盾的事情。 你有Qt的WYSIWYG小部件编辑器(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

我相信主窗口已经在QtDesigner中创建了一个名为“centralWidget”的小部件,或类似的东西(打开FilmInput.ui并检查实际的命名)。 假设您尚未在QtDesigner中创建布局,那么您应该在其上设置布局。

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

如果您的QtDesigner表单(FilmInput.ui)已经在centralWidget上设置了布局,请在设计器表单中添加一个新的QWidget作为centralWidget布局中centralWidget的子项,并将其命名为'sidePanel'或无论什么都有意义,然后做:

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