2017-09-26 2 views
0

QWidget 및 Ui_Form에서 상속 된 클래스가 있습니다 (자동 생성 클래스는 Qt에서 .ui를 만들 때 나타납니다).QWidget "access violation"exeption

class MyClass: public QWidget, public Ui_Form {} 

Ui_Form가 .ui 파일에서 관련 위젯 (예를 들어, QLineEdits, QButtons 등)와 연결 일부 구성원을 가지고 것 같습니다.

class Ui_Form { 
public: 
QLineEdit *fileNameEdit; 

    void setupUi(QWidget *Form) { 
    fileNameEdit = new QLineEdit(layoutWidget); 
    fileNameEdit->setObjectName(QStringLiteral("fileNameEdit")); 
    } 
} 

MyClass는 Ui_Form에서 상속되므로이 membes를 사용할 수 있습니다. 하지만 무언가를하려고 할 때 "Access violation reading location"이라는 예외가 있습니다. 예 :

fileNameEdit->setText("String"); 

누군가 조언을 줄 수 있습니까?

+0

그리고 setupUi를 실행 한 후에합니까? – dbrank0

+0

[documentation at glance] (http://doc.qt.io/qt-4.8/designer-using-a-ui-file.html)는 생성자에서'setupUi (this) '를 호출해야한다는 것을 보여준다. 너? – Botje

+0

예, setupUI를 실행했습니다. 그리고 회원들은 NULL과 동등하지 않습니다. 하지만, 실수는 어쨌든 나타납니다 – Dmitrii

답변

1

Ui_Form 부분을 통합하는 방법은 기본적으로 Qt proposes이 아닙니다. 이 button example에 보면 당신은 UI 부분이 diferently 통합하는 방법을 볼 수 있습니다

헤더 파일

#ifndef BUTTON_H 
#define BUTTON_H 

#include <QWidget> 

namespace Ui { 
class Button; 
} 

class Button : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit Button(int n, QWidget *parent = 0); 
    ~Button(); 

private slots: 
    void removeRequested(); 

signals: 
    void remove(Button* button); 
private: 
    Ui::Button *ui; 
}; 

#endif // BUTTON_H 

CPP 코드의 주요 차이점은

#include "button.h" 
#include "ui_button.h" 

Button::Button(int n, QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Button) 
{ 
    ui->setupUi(this); 
    ui->pushButton->setText("Remove button "+QString::number(n)); 
    addAction(ui->actionRemove); 
    connect(ui->actionRemove,SIGNAL(triggered()),this,SLOT(removeRequested())); 
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(removeRequested())); 
} 

Button::~Button() 
{ 
    delete ui; 
} 

void Button::removeRequested() 
{ 
    emit remove(this); 
} 

나는 믿는다 당신은 Ui_From::setupUi 기능을 호출하지 않습니다. Qt 제안 템플릿을 따를 필요가 없다는 것은 분명한 사실입니다 (클래스 멤버를 상속하지 않고 클래스 멤버로 통합). 그러나 Qt 제안을 따르는 것이 내 관점에서 훨씬 명확합니다.

+1

사실, 다중 상속을 통한'Ui_Form '을 포함하는 것이 최선의 해결책은 아닙니다 : MyClass 사용자의 의존성을 높이고 UI 구성원을 공개합니다 (모두 public 임). 대신 보호 된 상속을 통해이를 피하십시오). – cbuchart