2017-09-26 69 views
0

A有一个继承自QWidget和Ui_Form的类(在Qt中创建一个.ui时会出现automaticaly生成的类)。它看起来像QWidget“访问冲突”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继承的,我可以使用这些元素。但是,当我尝试做某事时,我有一个豁免“访问冲突读取位置”。例如:

fileNameEdit->setText("String"); 

有人可以给点建议吗?

+0

而你在setupUi运行之后呢? – dbrank0

+0

[浏览文档](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建议的模板(将ui作为类成员,而不是从它继承),但是,从我的角度来看,如果你遵循Qt建议,则会更加清晰。

+1

确实,通过多重继承包括'Ui_Form'并不是最好的解决方案:它增加了MyClass用户的依赖关系,并暴露了UI的成员(尽管你可以相反,通过保护继承来避免这种情况)。 – cbuchart