0

嗨,我正在尝试在 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

1 回答 1

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);
于 2013-07-22T19:22:32.740 回答