crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> проблема с рисованием линии
trubala
  опции профиля:
сообщение 10.2.2011, 0:13
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 10.2.2011
Пользователь №: 2401

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток! проблема, мне нужно к полигону от другого полигона нарисовать 3 линии, так получаеться, что 1-я линия рисуеться нормально, 2-я линия так же рисуеться но 1-й уже нет на сцене, тоже самое и с 3-й линией, 2-я пропадает.

Thanks!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
slav
  опции профиля:
сообщение 10.2.2011, 0:19
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 22.12.2010
Пользователь №: 2292

Спасибо сказали: 0 раз(а)




Репутация:   0  


А можно код
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trubala
  опции профиля:
сообщение 10.2.2011, 0:57
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 10.2.2011
Пользователь №: 2401

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(slav @ 10.2.2011, 0:19) *
А можно код

Раскрывающийся текст
void lineclass::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    if(_beginItem->collidesWithItem(_endItem))
        return;
    QLineF BegToEndItemLine(_beginItem->scenePos(), _endItem->scenePos());
    QPolygonF _endPolygon = _endItem->polygon();
    QPointF p1 = _endPolygon.first() + _endItem->pos();
    QPointF p2, _point;
    QLineF polyLine;
    int i;
    for(i = 1; i < _endPolygon.count(); ++i)
    {
        p2 = _endPolygon.at(i) + _endItem->pos();
        polyLine = QLineF(p1, p2);
        QLineF::IntersectType intersT = polyLine.intersect(BegToEndItemLine, &_point);
        if(intersT == QLineF::BoundedIntersection)
            break;
        p1 = p2;
    }
    if(K7Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin));
    if(p296Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    if(p2Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin));
    if(p268Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin));
    if(p269Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DashDotDotLine, Qt::RoundCap, Qt::RoundJoin));
    if(p274Line != NULL) painter->setPen(QPen(Qt::green, 4, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
    if(shLine != NULL) painter->setPen(QPen(Qt::gray, 4, Qt::SolidLine, Qt::FlatCap, Qt::RoundJoin));
    painter->setRenderHint(QPainter::Antialiasing, true);
    painter->setBrush(Qt::black);
    vtorPolygon = _endItem->pos() + QPointF(25.0, 20);
    if(_endItem->IzmUr_d->o1)
    {
        vtorPolygon = _endItem->pos();
        vtorPolygon.setY(_endItem->pos().y() + 20);
        _endItem->IzmUr_d->po1 = linePolygon;
        painter->drawPolygon(_endItem->IzmUr_d->po1);

    }
    if(_endItem->IzmUr_d->o2)
    {
        vtorPolygon = _endItem->pos();
        vtorPolygon.setY(_endItem->pos().y() + 53);
        _endItem->IzmUr_d->po2 = linePolygon;
        painter->drawPolygon(_endItem->IzmUr_d->po2);
    }
    if(_endItem->IzmUr_d->o3)
    {
        vtorPolygon = _endItem->pos();
        vtorPolygon.setY(_endItem->pos().y() + 80);
        _endItem->IzmUr_d->po3 = linePolygon;
        painter->drawPolygon(_endItem->IzmUr_d->po3);
    }
    if(_beginItem->Generator_d)
    {
        pervPolygon = _beginItem->pos() + QPointF(25.0,_beginItem->Generator_d->offset); //из размеров полигона в graphitemclass
    }
    //vtorPolygon = _endItem->pos() + QPointF(25.0, 20);
    if(_beginItem->kt4_d != NULL)
    {
        _beginItem->RePaintKT4();
    }
    if(_endItem->kt4_d != NULL)
    {
        _endItem->RePaintKT4();
        vtorPolygon = _endItem->pos() + QPointF(140, 40);
    }
    this->setLine(QLineF(pervPolygon, vtorPolygon));
    painter->drawLine(line());
    painter->drawPolygon(linePolygon);
    if (isSelected()) {
        painter->setPen(QPen(Qt::black, 1, Qt::DashLine));
        QLineF myLine = line();
        myLine.translate(0, 4.0);
        painter->drawLine(myLine);
        myLine.translate(0,-8.0);
        painter->drawLine(myLine);
      }
}


это код рисования линии, физически все 3 созданных линии есть(память выделена и не освобождалась), но видимо перисовка не правильно работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
slav
  опции профиля:
сообщение 10.2.2011, 2:29
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 22.12.2010
Пользователь №: 2292

Спасибо сказали: 0 раз(а)




Репутация:   0  


а если попробывать в начале метода вызывать painter->save();
а в конце painter->restore();
?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trubala
  опции профиля:
сообщение 10.2.2011, 2:55
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 10.2.2011
Пользователь №: 2401

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(slav @ 10.2.2011, 2:29) *
а если попробывать в начале метода вызывать painter->save();
а в конце painter->restore();
?

нет, такая же фигня(((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 10.2.2011, 4:21
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата
if(K7Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin));
if(p296Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
if(p2Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin));
if(p268Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin));
if(p269Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DashDotDotLine, Qt::RoundCap, Qt::RoundJoin));
if(p274Line != NULL) painter->setPen(QPen(Qt::green, 4, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
if(shLine != NULL) painter->setPen(QPen(Qt::gray, 4, Qt::SolidLine, Qt::FlatCap, Qt::RoundJoin));

если не секрет, что это за ужас?
И вообще, страшный код. Совсем не в стиле Qt. Ну что за _endItem->IzmUr_d->o2? Почему префиксы _ и для локальных переменных, и для полей?
Ну и не приватные поля — это ж плохо вообще-то.

По теме — a boundingRect() определил? Кстати, save и restore делать не надо, ибо view это сам сделает, если там соответствующий флаг включён (а по умолчанию он включён).

Сообщение отредактировал Obey-Kun - 10.2.2011, 4:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 10.2.2011, 7:53
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  



ОФФ:


Цитата(Obey-Kun @ 10.2.2011, 6:21) *
И вообще, страшный код.

тяжёлое наследие борланда чувствуется :))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trubala
  опции профиля:
сообщение 10.2.2011, 23:46
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 10.2.2011
Пользователь №: 2401

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Obey-Kun @ 10.2.2011, 4:21) *
Цитата
if(K7Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin));
if(p296Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
if(p2Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin));
if(p268Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin));
if(p269Line != NULL) painter->setPen(QPen(Qt::black, 4, Qt::DashDotDotLine, Qt::RoundCap, Qt::RoundJoin));
if(p274Line != NULL) painter->setPen(QPen(Qt::green, 4, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
if(shLine != NULL) painter->setPen(QPen(Qt::gray, 4, Qt::SolidLine, Qt::FlatCap, Qt::RoundJoin));

если не секрет, что это за ужас?
И вообще, страшный код. Совсем не в стиле Qt. Ну что за _endItem->IzmUr_d->o2? Почему префиксы _ и для локальных переменных, и для полей?
Ну и не приватные поля — это ж плохо вообще-то.

По теме — a boundingRect() определил? Кстати, save и restore делать не надо, ибо view это сам сделает, если там соответствующий флаг включён (а по умолчанию он включён).


Это различные типы кабелей связи(т.е разные линии) у каждого кабеля свои параметры
"_endItem->IzmUr_d->o2" - это итем к которому проводят линию, IzmUr_d - это одно из устройств к которому может быть проведена линия

QRectF lineclass::boundingRect() const 
{
qreal extra = (pen().width() + 20) / 2.0;

return QRectF(line().p1(), QSizeF(line().p2().x() - line().p1().x(),
                                  line().p2().y() - line().p1().y()))
    .normalized()
    .adjusted(-extra, -extra, extra, extra);

}


Цитата(Алексей1153 @ 10.2.2011, 7:53) *
тяжёлое наследие борланда чувствуется :))


Есть такое дело=))))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trubala
  опции профиля:
сообщение 11.2.2011, 1:39
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 10.2.2011
Пользователь №: 2401

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я брал пример программы с qt\examples\graphicsview\diagramscene
суть точно такая же, но и там в примере нельзя 2-ю линию провести....

М
Прекратите цитировать целыми сообщениями, тем более такими большими.
Прочтите "Справка по кнопкам и тэгам форума"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.4.2024, 17:18