Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: voipp от Октябрь 24, 2009, 20:19



Название: перерисовка с paintEvent
Отправлено: voipp от Октябрь 24, 2009, 20:19
Идея приложения следующая - создаются DockWidget 4 кнопки, а на Widget согласно нажатиям на кнопку линия чертится в нужную сторону.
При выполнении данного ниже кода появляется список memory map а потом пишется the programm has unexpectadly finished
Код:
здесь происходит рисование -

class Widget : public QWidget
{

private:
    enum direction{up,down,left,right};
    direction curr_direct;
    QPainter* painter;
 public:
   // QPainter *painter;
    QPen *pen;
    QPoint *curr_point;
    Widget(QWidget *parent=0);
    void Up();
    void Down();
    void Left();
    void Right();
    void paintEvent(QPaintEvent*);

};
Widget::Widget(QWidget *parent):QWidget(parent)
{
     painter= new QPainter(this);
    pen= new QPen;
    pen->setColor(Qt::red);
    pen->setWidth(5);
    painter->setPen(*pen);
    *curr_point= QPoint(0,0);
    painter->setPen(*pen);
    curr_direct= down;

}

void Widget::Up(){
    curr_direct= up;
    update();
};
// Down etc. определяются также
void Widget::paintEvent(QPaintEvent*){

    switch (curr_direct){
        case up:
            painter->drawLine(*curr_point,(*curr_point+= QPoint(curr_point->x(),curr_point->y()- 5)));
            break;
        case down:
            painter->drawLine(*curr_point,(*curr_point+= QPoint(curr_point->x(),curr_point->y()+ 5)));
            break;
        case left:
            painter->drawLine(*curr_point,(*curr_point+= QPoint(curr_point->x()+ 5,curr_point->y())));;
            break;
        case right:
            painter->drawLine(*curr_point,(*curr_point+= QPoint(curr_point->x()- 5,curr_point->y())));;
            break;
        };
};

здесь связывание -

class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    class Widget* where2paint;
public:
    Ui::MainWindow *ui;


};

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{

    ui->setupUi(this);
connect(ui->Up,SIGNAL(Clicked),where2paint,SLOT(pUp()));
connect(ui->Down,SIGNAL(Clicked),where2paint,SLOT(pDown()));
connect(ui->Left,SIGNAL(Clicked),where2paint,SLOT(pLeft()));
connect(ui->Right,SIGNAL(Clicked),where2paint,SLOT(pRight()));

}


Может есть предложения по изменению кода?


Название: Re: перерисовка с paintEvent
Отправлено: Rcus от Октябрь 24, 2009, 20:39
Выполнение кода в голове заканчивается SIGSEGV'ом на
Код:
    *curr_point= QPoint(0,0);
Ибо доступ по неиницализированному указателю


Название: Re: перерисовка с paintEvent
Отправлено: voipp от Октябрь 24, 2009, 21:05
спасибо.Но ошибки при этом не закончились -
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
Object::connect: Parentheses expected, signal QPushButton::Clicked in mainwindow.cpp:10

The program has unexpectedly finished.


Название: Re: перерисовка с paintEvent
Отправлено: voipp от Октябрь 24, 2009, 21:19
добавил заголовок QObject и исправил сигналы на clicked() и снова ошибка -
The program has unexpectedly finished.

/home/voipp/QTPROGRAMMS/LAB2/LAB2 exited with code 0


Название: Re: перерисовка с paintEvent
Отправлено: voipp от Октябрь 25, 2009, 01:27
Может есть рекомендации как это организовать подругому?


Название: Re: перерисовка с paintEvent
Отправлено: Rcus от Октябрь 25, 2009, 06:39
QPainter за редкими исключениями лучше создавать на стеке в paintEvent (о чем вам сыпались предупреждения).
Сообщение "The program has unexpectedly finished." совершенно неинформативно. Попробуйте запуск под отладчиком, тогда по крайней мере будет след стека вызовов.


Название: Re: перерисовка с paintEvent
Отправлено: voipp от Октябрь 25, 2009, 16:31
все я починил программу но появилась новая проблема - при перерисовке предыдущее что я нарисовал затирается(я совсем про это забыл).Буду изучать Canvas может это будет то что мне нужно