2013-05-21 3 views
0

현재 기본 학교 프로젝트를 진행하고 있으며 현재 발생하고있는 문제를 해결하는 방법을 알 수 없습니다. 저는 C++과 Qt 모두 초보자입니다. 그래서 오류는 사소한 것일 수 있습니다. (그리고 제가되고 싶습니다!)레이아웃이 설정되어 있지만 QWidget이 여전히 비어 있습니다.

최근에 개발 한 클래스를 사용하려고합니다. 기사 편집자. 이 클래스는 QWidget에서 상속 받았으며 기본적으로 기사 (제목 및 텍스트)를 편집하고 수정 사항을 저장할 수있는 작은 창을 의미합니다. 현재로서는이 클래스를 기본 방식으로 사용하고 ArticleEditor의 인스턴스를 만들어 main.cpp 파일에 표시하지만 이제는 더 까다로운 작업을하려고합니다.

요점은 파일을 가져온 후 ArticleEditor 위젯/창을 여는 것입니다. 문제없이 파일 선택 부분을 얻었지만 파일을 선택하면 ArticleEditor 위젯이 열리면서 완전히 비어 있습니다. 생성자 내부에서 setSize에 설정 한 크기가 고려되지만, 레이아웃에 설정하고 추가하는 위젯은 생성자에서도 나타나지 않으며 표시되지 않습니다. 당신은 두 개의 텍스트 필드 중 하나 saveArticle를 편집 할 때이 버튼을 저장할 수 있도록하기위한 것입니다 enableSave() :

ArticleEditor.cpp : 여기

은 상황을 이해하는 데 도움이됩니다 내 코드입니다()는 여기에서 중요하지 않은 또 다른 메소드입니다.

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 (layout) 대신 this-> setLayout (layout))으로 직접 설정하려고 시도했지만, 이렇게 할 때마다 위젯의 내용이 표시되지만 신호/슬롯 연결은 누군가가 내가 잘못 걸 설명 할 수 있다면

, 나는 매우 감사하게 될 거라고 ... 더 이상 작동하지 않습니다

편집이 :. 난 그냥 후에도이 위젯을 추가하는 것으로 나타났습니다 내 레이아웃에서 layout-> isEmpty()를 호출하면 반환 값으로 true가됩니다 ...

+2

당신은뿐만 아니라 (이동 없애 수)이 호출을 - QVBoxLayout는 위치를 변경하는 것입니다 어쨌든 당신이 그것에 추가 한 위젯. –

+0

고마워, 나는 그 여분의 선을 지금 제거하는 것을 잊었다. –

+0

테스트 응용 프로그램을 만들었습니다. 모든 것이 나를 위해 작동합니다. – Shf

답변

1

클래스 자체는 괜찮습니다.하지만 코안 권장 방식을 사용하면 코드에 훨씬 더 명확하게 나타납니다.

귀하의 문제는 귀하가 귀하의 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();) 

의 istead이 같은 수행 그들이 어떤 차이를 만들 수 없습니다

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 
+0

정말 고마워요,이 완전히 작동합니다! 내 코드에 articleWidget의 레이아웃이 없다는 사실에 대해 당신이 옳았습니다. 이제는 ArticleEditor 인스턴스를 추가 한 상태에서 모든 것을 올바르게 추가 했으므로 모든 것이 올바르게 작동합니다. Qt에 대한 현재의 제한된 지식으로는 나 자신을 찾지 못했을 것이라고 생각합니다. 정말 고마워요! –

+0

그것은 expirience와 함께, 그냥 레이아웃과 자녀 - 부모 관계에 대해 읽을 시간이 좀 찾아, Qt는 아마도 최고의 문서를 가지고 있습니다. 그건 그렇고, layout-> isEmpty() 라인 전에 this-> setLayout (layout); false를 보여줍니다. 그 다음에 true로 표시됩니다. 예상대로 :) setLayout() 메서드에 대해 읽으십시오. :) – Shf

2

생각합니다. ArticleEditor.cpp에 당신은 당신의 레이아웃 위젯도 ArticleEditor 위젯의 자녀가되어야합니다

layout = new QVBoxLayout(this); 

위젯의 아이를 만들 필요가; 즉 title, textsave입니다.

+0

다음 행을 추가하여 솔루션을 시도했습니다. text-> setParent (this); title-> setParent (this); save-> setparent (this); 나는 각 구성 요소의 각 설정 직후에 이것을 넣었고 layout = new QVBoxLayout()으로 줄을 수정하여 여러분이 제공 한 솔루션에 맞도록했지만 아직 위젯 내부에는 아무것도 보이지 않는다. 나는 layout-> isEmpty()를 할 때, 사실이 나왔다는 것을 알게되었다. 나는 더 이상 잃어 버렸다. –

+1

나는 이런 식으로'title = new QLineEdit (this);'등 – koan

+0

새로운 코멘트로 다시 시도했지만 여전히 위젯을 볼 수 없다 ... 나는 내가 할 수있는 어리석은 실수를 저질렀다고 확신한다. 감지 할 것 같아. (나는 당신이 방금 쓴 것이 setParent를 사용하는 것과 동일하다고 생각했기 때문에 후자를 썼다.하지만 어쩌면 내가 잘못 생각했다) –

관련 문제