我试图在Qt上进行网络连接,但是在运行该程序时,我遇到了一个奇怪的错误,当我单击正在运行的程序外的任何地方或打开任何其他应用程序时,所有图形都消失了。
这是代码
#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()
{
}
答案 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!!
现在进行编译-编译器会将您修改对象的所有位置标记为错误。您需要将这些计算移到其他位置,以便绘画不会修改对象。这样就可以了。