QT-MSVC 错误 C2248

Posted

技术标签:

【中文标题】QT-MSVC 错误 C2248【英文标题】:QT-MSVC error C2248 【发布时间】:2015-02-23 19:01:08 【问题描述】:

我目前正在使用 QT 和 MSVC 13 编译器开发 gui。 在设置网格时,我遇到了 QWidget 错误

C:\Users\Gaz\Documents\CS22510\simsquare.h:15: error: C2248: 'QWidget::operator =' : cannot access private member declared in class 'QWidget'

在头文件中

#ifndef SIMSQUARE_H
#define SIMSQUARE_H

#include <QWidget>


class SimSquare : public QWidget

     Q_OBJECT
public:
    SimSquare(QWidget *parent = 0);
    ~SimSquare();
protected:
    void PaintEvent(QPaintEvent *);
;

#endif // SIMSQUARE_H

这是cpp文件

#include "simsquare.h"
#include <QtGui>


SimSquare::SimSquare(QWidget *parent) : QWidget(parent)

    QPalette palette(Square::palette());
    palette.setColor(Qt::white);
    setPalette(palette);



void SimSqaure::PaintEvent(QPaintEvent *)
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(Qt::white, Qt::SolidPattern);
    painter.drawRect(10,15,80,90);


SimSquare::~SimSquare()



这是在

中引用的
#include "simulation.h"
#include "ui_simulation.h"
#include <QVector>

Simulation::Simulation(QWidget *parent) : QMainWindow(parent),
    ui(new Ui::Simulation)  
    
    simLayout = new SimBoard(this, 8);
    square = new SimSquare(this);
    for(int x =0; x<8; x++)
        for(int y =0; y<8; y++)
            //square = new SimSquare();
            squaresVec.append(&square);
            simLayout->add_widget(&square);
        
    
    this->setLayout(simLayout);
    ui->setupUi(this);



Simulation::~Simulation()

    delete ui;

感谢您提供的任何帮助。

【问题讨论】:

QObjects 不能被复制。 那么我在哪里做那个,我认为它可能是 square = SimSqaure(this),但我对 SimLayout 做同样的事情,这是一个 QGridLayout,没有遇到任何问题 也许在我们看不到的代码中。我不确定&amp;square 的任何一种情况是否正确,它已经是一个指针。您真的想要在矢量和布局中包含 64 个相同的对象吗? 啊,这是别人的建议。它应该创建一个 8x8 网格,因此使用了矢量,以便在发生变化时我可以轻松地重置网格的每个正方形。我给出的代码是 SimSquare 目前唯一使用过的地方 哦,原来 square 不存在,它在 for 循环中,我忘了我移动它来尝试修复它 【参考方案1】:

好的,解决了这个问题,

#include "simulation.h"
#include "ui_simulation.h"
#include "simsquare.cpp"
#include "simboard.cpp"
#include <QVector>
#include <QDebug>

Simulation::Simulation(QWidget *parent) : QMainWindow(parent),
    simui(new Ui::Simulation)
    
    setupUI();
    this->show();


void Simulation::setupUI()

    SimBoard simLayout(this,8);
    for(int x =0; x<8; x++)
        for(int y =0; y<8; y++)
            SimSquare square(this);
            squaresVec.append(&square);
            simLayout.add_widget(&square);
        
    
    this->setLayout(&simLayout);
    qDebug() << "Setting layout";
    simui->setupUi(this);
    qDebug() << "setu[ UI";


基本上因为 QWidget 不能被复制而不是使用 = new 对其进行初始化,所以您在头文件中创建对象,然后在 cpp 中使用 Constructor objectname(parameters) 调用构造函数。

以防万一其他人遇到这个问题。

【讨论】:

你没有解决任何问题。您在堆栈上创建的 SimSquare 在 2 行后超出范围,并且您的向量中有一个悬空指针。 SimBoard 在函数结束时也超出范围。

以上是关于QT-MSVC 错误 C2248的主要内容,如果未能解决你的问题,请参考以下文章

错误:C2248:“QVariant::QVariant”:无法访问在“QVariant”类中声明的私有成员

命名空间内的错误 c2248 朋友类

“错误C2248:'CObject :: CObject':无法访问在类'CObject'中声明的私有成员[重复]

错误 C2248:“klientPracownik::klientPracownik”:无法访问在“klientPracownik”类中声明的私有成员

带有 std::thread 的 MVSE12 中的错误 C2248

在 Visual Studio 2012 中编译启用 CLR 的 C++ 项目时出现 C2248 错误