2017-09-26 70 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