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

时间:2018-08-07 19:15:06

标签: c++ qt

我试图在Qt上进行网络连接,但是在运行该程序时,我遇到了一个奇怪的错误,当我单击正在运行的程序外的任何地方或打开任何其他应用程序时,所有图形都消失了。 this is a pic of the running program at first

and this when I click anywhere outside the running program

这是代码

#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()
{

}

1 个答案:

答案 0 :(得分:2)

这是一个简单的问题:paint事件实际上应该是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!!

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