2016-11-23 5 views
0

コンストラクタとは異なるメンバクラスのポインタを初期化するときに、奇妙な(少なくとも私にとっては予期せぬ)動作(クラッシュ)の質問があります。 mainwindow.hでqtでコンストラクタの外側でnew演算子を呼び出すとクラッシュする

:私は私のコードの一部を添付しています

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

:実際に動作しますが、

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) 

セグメント違反が発生しました。

誰かが間違っていることを説明できますか? 、それは私が、コンストラクタ内のすべてのポインタを初期化しなければならなかった(とclasssメンバー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)と同じように書くことができます。クラスメンバーではなくローカル変数を初期化しています。最初の2つの引数として渡す値は何にも使われません。

pixmapとペインタをポインタで保持することも完全に不要です。 pixmapを値で保持し、ペイントを行うときにのみペインタをインスタンス化します。

ペインタをペイントしていないときにペインタを保持すると、ピックスマップが消費されたとき(読み込み元)に不要なピクスマップのコピーが作成される可能性があります。アクティブペインタを使用したピクスマップは「ダーティ」と見なされます。

次に、ピクセルマップを値で保持し、新しい値を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); 
    } 
}; 
関連する問題