我目前正在从事基础学校项目,我无法想出如何解决我目前遇到的问题。请记住,我是C ++和Qt的初学者,所以错误可能是微不足道的(我希望它是!)
我正在尝试使用我最近开发的类:ArticleEditor。该类继承自QWidget,基本上是一个小窗口,您可以在其中编辑文章(标题和文本)并保存修改。现在,我已经设法以一种基本的方式使用这个类,通过创建ArticleEditor的实例并在main.cpp文件中显示它,但现在我正在尝试做一些更棘手的事情。
重点是在选择文件后打开ArticleEditor小部件/窗口。我已经实现了文件选择部分没有问题,但是当我选择了我的文件时,ArticleEditor小部件打开并且......完全为空。我在其构造函数中的setSize中设置的大小被考虑在内,但是我设置并添加到布局中的小部件(也在构造函数中)不存在,也不可见。
这是我的代码,它可以帮助您了解情况:
ArticleEditor.cpp : enableSave()用于在编辑两个文本字段之一时启用保存按钮,saveArticle()是另一种在这里不重要的方法。
ArticleEditor::ArticleEditor(Article* article, QWidget *parent) :
QWidget(parent)
{
title = new QLineEdit();
title->setFixedWidth(180);
title->move(10,10);
text = new QTextEdit();
text->setFixedSize(180,110);
text->move(10,45);
save = new QPushButton();
save->setText("Save");
save->setFixedWidth(80);
save->move(10,170);
save->setEnabled(false);
title->setText(article->getTitle());
text->setText(article->getText());
QObject::connect(save, SIGNAL(clicked()), this, SLOT(saveArticle()));
QObject::connect(title, SIGNAL(textChanged(const QString)), this, SLOT(enableSave()));
QObject::connect(text, SIGNAL(textChanged()), this, SLOT(enableSave()));
layout = new QVBoxLayout;
layout->addWidget(title);
layout->addWidget(text);
layout->addWidget(save);
this->setFixedSize(200,200);
this->setLayout(layout);
}
ArticleEditor.h
class ArticleEditor : public QWidget
{
Q_OBJECT
public:
explicit ArticleEditor(Article* article, QWidget* parent);
private:
QLineEdit* title;
QTextEdit* text;
QPushButton* save;
QVBoxLayout* layout;
Article* ressource;
public slots:
void saveArticle();
void enableSave();
private slots:
};
选择一个文件后(我不打算提供详细信息,因为路径工作正常),我做了类似的事情:
ArticleEditor aE(&a, articleWidget); // calling the constructor with an article I've fetched using the path, and setting articleWidget (a private attribute) to be the parent
articleWidget->show(); // showing the result
这里,articleWidget是我的类的一个属性,创建为articleEditor实例的父窗口小部件。
我也尝试将布局直接设置为父窗口小部件(parent-> setLayout(布局)而不是this-> setLayout(布局),但每当我这样做时,窗口小部件的内容会显示,但是我的信号/插槽连接不再起作用了......
如果有人能解释我的错误,我会非常感激。
编辑:我刚刚注意到即使将小部件添加到我的布局后,当我尝试layout-> isEmpty()时,我也会得到true作为返回值......
答案 0 :(得分:2)
我认为在ArticleEditor.cpp
中你需要让你的布局成为小部件的孩子
layout = new QVBoxLayout(this);
您的小部件也应该是ArticleEditor小部件的子级;即title
,text
和save
。
答案 1 :(得分:1)
这个类本身很好,但你真的应该使用koan推荐的方法,它为代码提供了更多的清晰度。
您的问题是您设置了ArticleWidget的父级,但没有为其添加布局。
ArticleEditor aE(&a, articleWidget);
articleWidget->show(); // showing the result (by the way, if you are not using new, when create widget, it shuold be articleWidget.show();)
做这样的事情:
ArticleEditor aE=new ArticleEditor(&a, articleWidget); //creating articleEditor aE with articleWidget as parent
QVBoxLayout* articleWidgetLayout=new QVBoxLayout(articleWidget); // creating layout in articleWidget
articleWidgetLayout->addWidget(aE); //adding aE to it
articleWidget->show(); // showing the result