Сбой приложения при использовании QPainter на QPixmap

Я пытаюсь создать класс, который будет делать точечную графику. Класс наследуется от QWidget. Я хочу, чтобы он рисовал линии и точки на QPixmap, которые будут отображаться в QLabel.

Конструктор класса выглядит так:

MyClass::MyClass()
{
    calcul_proprietes(); // Function that makes calculation of what to draw.
    pix = new QPixmap(760,350);

    dessiner_graphique(); // Function that does the drawing.

    //Displaying the qpixmap
    layout_principal = new QVBoxLayout(this);
    label_pix = new QLabel(this);
    label_pix->setPixmap(*pix);
    layout_principal->addWidget(label_pix);
    this->setLayout(layout_principal);
}

И короткая часть функции, которая рисует

void MyClass::dessiner_graphique()
{
    // ...
    QPainter painter(pix);
    QRect contour(x_depart,y_depart,largeur_grille,hauteur_grille);
    painter.drawRect(contour);
    // ...
}

Я не хочу использовать функцию paintEvent, потому что она вызывается все время, и мне нужно, чтобы моя графика была нарисована только один раз. Что я делаю не так?


person Antoine LeBrun    schedule 27.05.2015    source источник
comment
Нам нужно увидеть больше вашего кода, чтобы понять, что именно вы делаете не так.   -  person Venemo    schedule 27.05.2015
comment
На самом деле у меня это работает (Windows 8.1, Qt 5.4.1, VS 2013). Опишите, пожалуйста, проблему. Кстати, я думаю, вам не нужно хранить layout и pixmap в качестве переменных-членов, или вы также используете их позже?   -  person p.i.g.    schedule 27.05.2015
comment
@Venemo: Весь мой код рисования работает, если я помещаю его в paintEvent, но он вылетает, когда я пытаюсь сделать это с помощью растрового изображения. Так что остальная часть кода рисования не имеет большого значения.   -  person Antoine LeBrun    schedule 28.05.2015
comment
@vizhanyolajos С этим кодом приложение выйдет из строя без сообщения об ошибке компилятора.   -  person Antoine LeBrun    schedule 28.05.2015
comment
@vizhanyolajos И поскольку растровое изображение используется в функции, а не непосредственно в конструкторе, я решил, что будет проще сделать его переменной-членом, чем передавать аргумент функции.   -  person Antoine LeBrun    schedule 28.05.2015
comment
Опубликованный код мне кажется нормальным (хотя вызов this- ›setLayout () не нужен; достаточно указать (this) в качестве аргумента конструктора QVBoxLayout). Следующее, что вам нужно сделать, это определить, в какой именно строке происходит сбой программы при выполнении. Вы можете сделать это с помощью отладчика или разбросав операторы printf () или qDebug () и посмотрев, какие из них печатаются последними перед сбоем.   -  person Jeremy Friesner    schedule 28.05.2015
comment
@Antoine LeBrun: То, что я смог проверить, сработало нормально. Но вы не опубликовали свой полный код, поэтому, конечно, могут быть ошибки, но мы не сможем вам помочь, пока вы не покажете нам часть своего кода с ошибками. Как было сказано, отладьте его там, где проблема, или, по крайней мере, сообщите нам сообщение об ошибке.   -  person p.i.g.    schedule 28.05.2015
comment
Нет информации о сбоях? Кроме того, может быть, что устройство рисования не инициализировано правильно. Может, нужно вызвать begin ()?   -  person fassl    schedule 29.05.2015


Ответы (1)


Вы вызывали конструктор базового класса по умолчанию перед конструктором вашего класса?

MyClass( QObject *parent )
: QWidget( parent )
{
    // Your posted code.
}
person stasinek    schedule 27.05.2015
comment
На самом деле конструктор MyClass имеет еще 2 параметра (QStringList) после родительского QWidget *. - person Antoine LeBrun; 28.05.2015