Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
MagnastraW
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 3
1

Отрисовка линии по клику мыши на область

27.05.2012, 13:20. Просмотров 768. Ответов 0
Метки нет (Все метки)

Нужно нарисовать линии ,когда кликаем на определенную область.Проблема с том что когда я на неё кликаю ничего не происходит,в консоли при клике пишется сообщение QPainter::begin: Paint device returned engine==0,type: 1.За основу брался пример по созданию собственного виджите из книги по qt автор Жасмин Бланшет и Марк Саммерфилд.
iconeditor.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#ifndef ICONEDITOR_H
#define ICONEDITOR_H
 
#include <QColor>
#include <QImage>
#include <QWidget>
 
class IconEditor:public QWidget
{
    Q_OBJECT
    Q_PROPERTY(QColor penColor READ penColor WRITE setPenColor)
    Q_PROPERTY(QImage iconImage READ iconImage WRITE setIconImage)
    Q_PROPERTY(int zoomFactor READ zoomFactor WRITE setZoomFactor)
 
public:
    IconEditor(QWidget *parent=0);
 
    void setPenColor(const QColor &newColor);
    QColor penColor() const {return curColor;}
 
    void setZoomFactor(int newZoom);
    int zoomFactor() const {return zoom;}
    void setIconImage(const QImage &newImage);
    QImage iconImage() const {return image; }
    QSize sizeHint() const;
protected:
    void mousePressEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *event);
 
private:
    void setImage(const QPoint &pos,bool opaque);
 
 
    QColor curColor;
    QImage image;
    int zoom;
};
 
#endif // ICONEDITOR_H
iconeditor.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <QtGui>
 
#include "iconeditor.h"
 
IconEditor::IconEditor(QWidget *parent)
    :QWidget(parent)
{
    setAttribute(Qt::WA_StaticContents);
    setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
 
    curColor=Qt::black;
    zoom=1;
 
    image=QImage(93,93,QImage::Format_ARGB32);
    image.fill(qRgba(0,0,0,0));
}
 
QSize IconEditor::sizeHint() const
{
    QSize size=zoom * image.size();
    return size;
}
 
void IconEditor::setPenColor(const QColor &newColor)
{
    curColor=newColor;
}
void IconEditor::setIconImage(const QImage &newImage)
{
    if (newImage!=image){
        image=newImage.convertToFormat(QImage::Format_ARGB32);
        update();
        updateGeometry();
    }
}
 
void IconEditor::setZoomFactor(int newZoom)
{
    if(newZoom<1)
        newZoom=1;
 
    if (newZoom!=zoom) {
        zoom=newZoom;
        update();
        updateGeometry();
    }
}
 
void IconEditor::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    if (zoom>=0) {
        painter.setPen(palette().foreground().color());
        for (int i=0;i<=3;++i)
            painter.drawLine(31*i,0,31*i,93);
        for (int j=0;j<=3;++j)
            painter.drawLine(0,31*j,93,31 * j);
    }
}
 
 
void IconEditor::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton){
        setImage(event->pos(),true);
    } else if (event->button()==Qt::RightButton){
        setImage(event->pos(),false);
    }
}
 
void IconEditor::setImage(const QPoint &pos, bool opaque)
{
    int i=pos.x();
    int j=pos.y();
    if ((0<i)&(i<31)&(0<j)&(j<31)){
        QPainter painter(this); //полагаю что где-то здесь ошибка
            painter.drawLine(2,2,28,28);
    painter.drawLine(28,2,2,28);
        }
 
}
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#include <QtGui>
#include <QApplication>
 
#include "iconeditor.h"
 
int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    IconEditor *okno=new IconEditor;
    okno->show();
    return app.exec();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2012, 13:20
Ответы с готовыми решениями:

Отрисовка линии на виджете
Добрый день, помогите пожалуйста. Я написал класс - линию. Рисую на виджете. Проблема в том, что...

Qt + Opengl изменение цвета по клику мыши
Здравствуйте, начал изучать qt и вместе с ним opengl, никак не могу понять, как например...

Контекстное меню по правому клику мыши
День добрый. Есть форма, на нем дерево, еще пока пустое, надо чтобы когда нажали правой кнопкой...

Рисование точки по клику мыши QPainter QT
Здравствуйте, как связать события мыши mousePressEvent с событием paintEvent, чтобы по нажатию в...

Рисование линии в PictureBox при наведении мыши на определенную область
Доброго времени суток. Необходимо, чтобы при наведении мыши на определенную область в PictureBox...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2012, 13:20

Форма делится на сектора. Курсором мыши можно рисовать линии. Цвет линии зависит
Народ спасайте. Задача такова &quot; Форма делится на сектора (их количество задает пользователь)....

Отрисовка линии
Всем привет. вот что накатал: #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; ...

отрисовка линии
пишу логический анализатор, функция читает состояние порта, и присваивает 150 раз в секунду...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru