2016-11-23 61 views
0

调用构造函数之外新的运营商时,我有一个关于一个奇怪的问题(至少是出乎意料的对我来说)行为(它崩溃)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) 

,而是设置在像素图的构造(主窗口::主窗口)通过写

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); 

感谢

+0

至少,对于崩溃,您需要在程序中包含堆栈跟踪和所有相关变量的值。 – MrEricSir

回答

1

这是C++是如何工作的一个小小的误会,与Qt无关。

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

这也是完全没有必要持有像素图和指针的画家。通过值来保存像素图,并且在绘画时仅为它实例化画家。

当你没有在它上面绘画时,将一个画家拿到一个像素图中,当像素图被消耗(读取)时,可能会导致不必要的像素副本:一个带有活动画家的像素图被认为是“脏的”。

你应该怎么做,然后是按值保存pixmaps,你可以从initGraph返回新值 - 这从存储pixmap的周围类的细节中解耦initGraphinitGraph的用户具有不存储该像素图的选项,并且例如查询标签本身。

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); 
    } 
};