2016-11-23 64 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); 
    } 
};