代码之家  ›  专栏  ›  技术社区  ›  Dmitrii

QWidget“访问冲突”例外

  •  0
  • Dmitrii  · 技术社区  · 7 年前

    A have A class,继承自QWidget和Ui_Form(自动生成的类,在Qt中创建.Ui时出现)。看起来像

    class MyClass: public QWidget, public Ui_Form {}
    

    Ui\u表单有一些成员,这些成员与中的相关小部件连接。ui文件(例如,QLineEdits、QButtons等)。

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

    由于MyClass是从Ui_表单继承的,所以我可以使用这个membes。但是,当我尝试做某事时,我有一个例外“访问违反阅读位置”。例如:

    fileNameEdit->setText("String");
    

    有人能给点建议吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   apalomer    7 年前

    您合并 Ui_Form 部分不是如何 Qt proposes 默认情况下。如果你调查一下 button example

    头文件

    #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建议,则会更加清楚。