QWidget"访问违规" exeption

时间:2017-09-26 07:08:51

标签: c++ qt access-violation qwidget

有一个类,继承自QWidget和Ui_Form(自动生成的类,在Qt中创建.ui时出现)。它看起来像

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");

有人可以提出建议吗?

1 个答案:

答案 0 :(得分:1)

您合并Ui_Form部分的方式不是默认情况下的Qt proposes。如果您查看这个button example,您可以看到ui部分是如何被不同地合并的:

标头文件

#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建议,我的观点会更加清楚。< / p>