在qt中调用new运算符外部构造函数时崩溃

时间:2016-11-23 02:47:09

标签: c++ qt

当我在一个不同于构造函数的成员类上初始化指针时,我有一个关于奇怪的问题(至少对我来说是意料之外的)qt的行为(崩溃)。我附上了部分代码:

在mainwindow.h中:

class MainWindow : public QMainWindow
{
 ...
 private:
     QPixmap *qpm_s1_yaw;
     QPainter *s1_yaw_painter;
     ...
}

在mainwindow.cpp中:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
 ...
 initGraph(qpm_s1_yaw, s1_yaw_painter, ui->YAW1);
 ...
}

void MainWindow::initGraph(QPixmap *map, QPainter *painter, QLabel *label)
{
map = new QPixmap(label->size());
map->fill(Qt::white);
painter = new QPainter(map);

... doing some stuff ...

label->setPixmap(*map); // ++(Remember this LINE)++
}

这实际上有效,但当我评论该行时:

label->setPixmap(*map)

并通过编写以下方式在构造函数(MainWindow :: MainWindow)中设置Pixmap:

ui->YAW1->setPixmap(*qpm_s1_yaw)

我遇到了分段错误。

有人可以解释它有什么问题吗?为了使它工作,我必须初始化构造函数中的所有指针(并在类成员initGraph中注释这些行),如下所示:

qpm_s1_yaw = new QPixmap(ui->YAW1->size());
s1_yaw_painter = new QPainter(qpm_s1_yaw);
initGraph(qpm_s1_yaw, s1_yaw_painter, ui->YAW1);
ui->YAW1->setPixmap(*qpm_s1_yaw);

由于

1 个答案:

答案 0 :(得分:1)

这是对C ++如何工作的一个微不足道的误解,与Qt无关。

你的代码在于你:你同样可以写:initGraph(0, 0, ui->YAW1)。您正在初始化局部变量而不是类成员。作为前两个参数传递的值不用于任何内容。

通过指针握住像素图和画家也是完全没必要的。按值保存像素图,并在绘画时仅为其实例化画家。

当你没有在上面绘画时将画家拿到像素图上会导致在使用像素图时读取像素图的不必要的副本(读取):带有活动画家的像素图被认为是“脏”的。 / p>

你应该做的是按值保存像素图,你可以从initGraph返回新值 - 这会将initGraph与存储像素图的周围类的细节分离。 initGraph的用户可以选择不存储像素图,例如查询标签本身。

class MainWindow : public QMainWindow
{
  Ui::MainWindow ui; // hold by value
  ...
  QPixmap qpm_s1_yaw; // hold by value
  QPixmap initGraph(QLabel *label) {
    QPixmap pixmap{label->size()};
    pixmap.fill(Qt::white);
    QPainter painter{&pixmap};
    //... doing some stuff ...
    label->setPixmap(pixmap);
    return pixmap;
  }
public:
  explicit MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
    ui.setupUi(this);
    gpm_s1_yaw = initGraph(ui.YAW1);
  }
};