C++ 当我在运行程序之外的任何地方单击时,所有图形都会消失

C++ 当我在运行程序之外的任何地方单击时,所有图形都会消失,c++,qt,C++,Qt,我试图在Qt上创建类似于network的东西,但在运行程序时,我遇到了一个奇怪的错误,当我单击运行程序之外的任何地方或打开任何其他应用程序时,所有的图形都消失了。 这是密码 #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this-&

我试图在Qt上创建类似于network的东西,但在运行程序时,我遇到了一个奇怪的错误,当我单击运行程序之外的任何地方或打开任何其他应用程序时,所有的图形都消失了。

这是密码

#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setFixedSize(210*6+10,this->height());

    Lobes["Frontal Lobe"] = {"Higher Mental \n function",
                            "Broca's area",
                            "Motor Function\n(Eye Movement)"};

    Lobes["Partial Lobe"] = {"Motor Function\n(Muscles)",
                             "Somatosensory \n association\narea",
                             "Sensory Area"};

    Lobes["Temporal Lobe"] = {"Association area",
                             "Auditory area",
                             "Wernicke's area"};

    Lobes["Occiptal Lobe"] = {"Visual area"};

SizeCalculations();
}

Widget::~Widget()
{
    delete ui;
}
void Widget::paintEvent(QPaintEvent* e)
{

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::red);


    it = Lobes.begin();
    int space = 10;
    for(int x = 0; x < 6; x++)
    {

        if(x < 6)
        {
            Node *Rec = new Node(CognitveSpace,50,CogitiveFunctions[x],0,szCogntive);

            painter.drawRect(Rec->getRectangle());
            painter.drawText(Rec->getRectangle(), Qt::AlignCenter, Rec->getName());
           // painter.fillRect(Rec->getRectangle(),Qt::red);
            CognitveSpace += szCogntive.width()+10;
        }
        if(x < 4)
        {
           Node *Rec = new Node(LobesSpace,250,it->first,0,szLobes);
           painter.drawRect(Rec->getRectangle());
           painter.drawText(Rec->getRectangle(), Qt::AlignCenter, Rec->getName());
          // delete Rec;

           for(size_t index = 0; index < it->second.size();index++)
           {

               Node *Rec = new Node(AreasSpace,450,it->second[index],0,szAreas);
               painter.drawRect(Rec->getRectangle());
               painter.drawText(Rec->getRectangle(), Qt::AlignCenter, Rec->getName());
               space += 180;
               //delete Rec;
               AreasSpace += szAreas.width()+10;
           }
           it++;
           LobesSpace += szLobes.width()+10;
           AreasSpace = LobesSpace +15;
        }

    }

}


void Widget::SizeCalculations()
{
    szCogntive.setWidth((this->width() / 6) - CognitveSpace);
    szLobes.setWidth((this->width() / 4) - LobesSpace);
    szAreas.setWidth(szLobes.width()/3 - 15);
}
void Widget::on_pushButton_clicked()
{

}
#包括“widget.h”
#包括“ui_widget.h”
Widget::Widget(QWidget*父项):
QWidget(母公司),
ui(新ui::小部件)
{
用户界面->设置用户界面(此);
此->设置固定大小(210*6+10,此->高度());
肺叶[“额叶”]={“高级心理功能”,
“布罗卡区”,
“运动功能\n(眼球运动)”};
肺叶[“部分肺叶”]={“运动功能\n(肌肉)”,
“体感\n关联\n区域”,
“感觉区”};
肺叶[“颞叶”]={“关联区”,
“听觉区”,
“韦尼克区”};
肺叶[“枕叶”]={“视区”};
大小计算();
}
小部件::~Widget()
{
删除用户界面;
}
void小部件::paintEvent(QPaintEvent*e)
{
油漆工(本);
painter.setRenderInt(QPainter::抗锯齿);
画师:设置笔(Qt::红色);
它=波瓣。开始();
int空间=10;
对于(int x=0;x<6;x++)
{
if(x<6)
{
Node*Rec=新节点(认知空间,50,认知函数[x],0,sz认知);
painter.drawRect(Rec->getRectangle());
drawText(Rec->getRectangle(),Qt::AlignCenter,Rec->getName());
//fillRect(Rec->getRectangle(),Qt::red);
CognitveSpace+=szcognitive.width()+10;
}
if(x<4)
{
Node*Rec=新节点(LobesSpace,250,it->first,0,szLobes);
painter.drawRect(Rec->getRectangle());
drawText(Rec->getRectangle(),Qt::AlignCenter,Rec->getName());
//删除Rec;
对于(size\u t index=0;indexsecond.size();index++)
{
Node*Rec=新节点(AreasSpace,450,it->second[index],0,szAreas);
painter.drawRect(Rec->getRectangle());
drawText(Rec->getRectangle(),Qt::AlignCenter,Rec->getName());
空间+=180;
//删除Rec;
AreasSpace+=szAreas.width()+10;
}
it++;
LobesSpace+=szLobes.width()+10;
面积空间=波瓣空间+15;
}
}
}
void小部件::SizeCalculations()
{
setWidth((this->width()/6)-CognitveSpace);
setWidth((this->width()/4)-LobesSpace);
setWidth(szLobes.width()/3-15);
}
无效小部件::在按钮上单击
{
}

这是一个简单的问题:绘制事件实际上应该是常量。每次重新绘制时,您都会重复修改各种尺寸。但我们可以让编译器帮你解决问题-让我们修改代码,使你的对象在绘画中保持不变:

void Widget::paintEvent(QPaintEvent *event) {
  QPainter painter(this);
  paintEvent(event, painter);
}

void Widget::paintEvent(QPaintEvent *, QPainter &painter) const { // const is important!
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::red);
    // etc - rest of the code follows
}

// Declaration in the class
  void paintEvent(QPaintEvent *, QPainter &) const; // const!!

现在编译-编译器会将修改对象的所有位置标记为错误。您需要将这些计算移到其他位置,以便绘画不会修改对象。然后它就会工作。

这是一个简单的问题:绘制事件实际上应该是常量。每次重新绘制时,您都会重复修改各种尺寸。但我们可以让编译器帮你解决问题-让我们修改代码,使你的对象在绘画中保持不变:

void Widget::paintEvent(QPaintEvent *event) {
  QPainter painter(this);
  paintEvent(event, painter);
}

void Widget::paintEvent(QPaintEvent *, QPainter &painter) const { // const is important!
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::red);
    // etc - rest of the code follows
}

// Declaration in the class
  void paintEvent(QPaintEvent *, QPainter &) const; // const!!
现在编译-编译器会将修改对象的所有位置标记为错误。您需要将这些计算移到其他位置,以便绘画不会修改对象。然后它就会工作。

问题中的代码和类似代码。不在外部链接后面(特别是不在断开的链接后面)。代码和类似的东西都在问题中。不在外部链接后面(特别是不在断开的链接后面)。