您好我正在尝试在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();
}
答案 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);