Russian Qt Forum
Ноябрь 25, 2024, 00:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: перерисовка с paintEvent  (Прочитано 7347 раз)
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()));

}


Может есть предложения по изменению кода?
Записан
Rcus
Гость
« Ответ #1 : Октябрь 24, 2009, 20:39 »

Выполнение кода в голове заканчивается SIGSEGV'ом на
Код:
    *curr_point= QPoint(0,0);
Ибо доступ по неиницализированному указателю
Записан
voipp
Гость
« Ответ #2 : Октябрь 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.
Записан
voipp
Гость
« Ответ #3 : Октябрь 24, 2009, 21:19 »

добавил заголовок QObject и исправил сигналы на clicked() и снова ошибка -
The program has unexpectedly finished.

/home/voipp/QTPROGRAMMS/LAB2/LAB2 exited with code 0
Записан
voipp
Гость
« Ответ #4 : Октябрь 25, 2009, 01:27 »

Может есть рекомендации как это организовать подругому?
Записан
Rcus
Гость
« Ответ #5 : Октябрь 25, 2009, 06:39 »

QPainter за редкими исключениями лучше создавать на стеке в paintEvent (о чем вам сыпались предупреждения).
Сообщение "The program has unexpectedly finished." совершенно неинформативно. Попробуйте запуск под отладчиком, тогда по крайней мере будет след стека вызовов.
Записан
voipp
Гость
« Ответ #6 : Октябрь 25, 2009, 16:31 »

все я починил программу но появилась новая проблема - при перерисовке предыдущее что я нарисовал затирается(я совсем про это забыл).Буду изучать Canvas может это будет то что мне нужно
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.096 секунд. Запросов: 21.