Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qgraphicscene как правильно делать динамику? 
V
    Опции темы
Atiskara
Дата 23.6.2014, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Добрый день. Делаю отображение постоянно изменяющегося графика. Очень много айтемов. В итоге у меня получается что изменяемые айтемы начинают смещаться на сцене и прорисовываться поверх предыдущих.  Как правильно это делается стредствами qt? Удаление айтемов нигде не делаю, надо ли делать? А если надо, то допустим 
Код

scene->addLine(x1,y1,x2,y2,penGreen);

как тогда этот элемент удалить?
В мыслях крутится создание отдельной сцены, которой потом заменять предыдущую видимую сцену. Но ведь QGraphicsScene предназначен как раз таки для динамического управления элементами. Вот как это правильно делать?

Добавлено @ 07:59
Во. Перед новой отрисовкой сделала удаление всех айтемов:
Код

for(int i=0;i<scene->items().size();i++)
        scene->removeItem(scene->items().at(i));



Это сообщение отредактировал(а) Atiskara - 23.6.2014, 08:00
PM MAIL   Вверх
Atiskara
Дата 23.6.2014, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Хм... что то коряво работает. Происходит задержка удаления элементов.
PM MAIL   Вверх
Amp
Дата 23.6.2014, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Используй QPainter. Это будет быстрее. Либо пиши своего наследника от QGraphicsItem с переопределенной отрисовкой для той части сцены, которая часто обновляется и содержит много элементов.
PM MAIL   Вверх
Atiskara
Дата 23.6.2014, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Понятно, спасибо. Мне получается проще сделать вторую невидимую сцену, и подставлять вместо первой с каждым тиком. Просто я уже все сделала, и переделывать под qpainter... не знаю, быстро ль, долго ль. Надеюсь производительность не пострадает.
PM MAIL   Вверх
Avazart
Дата 23.6.2014, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



Цитата(Atiskara @  23.6.2014,  08:54 Найти цитируемый пост)
Хм... что то коряво работает. Происходит задержка удаления элементов. 

Уверены ? не должно быть.
Сколько элементов на сцене ?

PM MAIL   Вверх
Atiskara
Дата 24.6.2014, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Avazart, ну вообще то не настолько много, чтобы проявлялись задержки. 
4 кривых на графике, 1-10 лейблов, 1-10 либо линий, либо набор окружностей, либо изображений, несколько прямоугольников, линий, опять меток, шкала координатных осей тоже постоянно меняющаяся, еще один график, только теперь уже в виде сплошной области, ну и в общем то все.
Вот перед отрисовкой всего этого я делала удаление всех айтемов. 

Я все таки сделала так: с использованием второй сцены
Код

sceneVis = new QGraphicsScene(ui->graphicsView);


Код

 scene = new QGraphicsScene(ui->graphicsView);
    scene->setBackgroundBrush(QBrush(Qt::black));

    //Здесь отрисовка scene

    sceneVis = scene;
    ui->graphicsView->setScene(sceneVis);

На эмулированных данных работает как надо.
PM MAIL   Вверх
Avazart
Дата 24.6.2014, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



Выложите проект, если будет время посмотрю...
Не верется просто что тормозит.
PM MAIL   Вверх
Atiskara
Дата 25.6.2014, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Avazart, спасибо вам за желание помочь, только я к сожалению не могу выложить проект, коммерческий.
PM MAIL   Вверх
Avazart
Дата 25.6.2014, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



Ну на нет и суда нет, могли бы только обговоринную часть проекта выложить.
PM MAIL   Вверх
Atiskara
Дата 26.6.2014, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



ну если только область по теме то можно, просто проблему наглядно не увидете же:
Код

class RailDiagram : public QWidget
{
    Q_OBJECT

public:
    /**
      * @brief Sets parameters of consts and vars
      */
    explicit RailDiagram(QWidget *parent = 0);
    ~RailDiagram();

public slots:
    /**
      * @brief Draws new scene
      * @param raildata - is not used here
      * @param diagram - data on speeds of train
      * @param profile - data on profiles of railway
      * @param traindata - is not used here
      */
    void UpdateDiagram(RailwayDataStruct raildata, RailDiagramStruct diagram,
                       RailProfileStruct profile, TrainDataStruct traindata);

private:
    /**
      * @brief draws coordinate axes and legends of y-axe
      */
    void DrawAxes();

    /**
      * @brief draws limits of speeds on railway
      */
    void DrawSpeedLimits();

    /**
      * @brief draws diagram of 10 points of speeds runned by train
      *         and 51 calculated speeds needed to be runned by train
      */
    void DrawSpeedDiagram();

    /**
      * @brief draws semaphores, stations and train
      */
    void DrawObjects();

    /**
      * @brief draws labels of semaphores and stations
      */
    void DrawLabels();

    /**
      * @brief Removes collisions of labels, which makes effect of rearing labels from each other
      *         Used by DrawLabels();
      * @param labels - pointer on labels
      */
    QList<QGraphicsTextItem*> RemoveCollisions(QList<QGraphicsTextItem*> labels, int h);

    /**
      * @brief Draw milestones on the way, which also used as virtical grid on profile diagram
      */
    void DrawMileStones();

    /**
      * @brief Draws Horisontal grid on profile diagram
      *         and its legends
      */
    void DrawProfileScale();

    /**
      * @brief Draws diagram of profile and train over it
      */
    void DrawProfileDiagram();

    /**
      * @brief Puts icons of rail objects except semaphores, stations,
      *         and some ignored objects
      */
    void PutObjectsIcons();

    /**
      * @brief Replaces icons if they collides with others
      */
    void RemoveIconsCollisions(QList<QGraphicsPixmapItem*>pixmaps);

    /**
      * @brief Shows average values of profiles
      */
    void ShowAverageProfiles();

    /**
      * @brief Draws calculated speed limit by traction
      */
    void DrawCalculatedSpeedLimit();

private:
    Ui::RailDiagram *ui;
    RailDiagramStruct diagramdata_;   //!< data on diagram of speeds
    RailProfileStruct profile_;       //!< data on diagram of profile
    RailwayDataStruct raildata;       //!< does not used here, used as a part of slot
    TrainDataStruct traindata;        //!< does not used here, used as a part of slot
    QGraphicsScene *sceneVis;
    QGraphicsScene *scene;
    QPen pen;
    int diagramH;               //!< height of diagram of speeds
    const int profileH;         //!< height of diagram of profile
    int sceneH;                 //!< height of scene
    int sceneW;                 //!< height of width
    int step;                   //!< width of 1 piket on scene
    const int headOfTrain;      //!< points where is head of train
    const int numOfPikets;      //!< number of pikets on screen
    const int leftTab;          //!< width of left indention
    const int piket;            //!< width of 1 piket on railway = 100m
};


Код

#include "raildiagram.h"
#include "ui_raildiagram.h"
#include <QTextCodec>

RailDiagram::RailDiagram(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::RailDiagram),
    numOfPikets(50),
    leftTab(50),
    headOfTrain(11),
    piket(100),
    profileH(110)
{

    ui->setupUi(this);    

    diagramH = ui->graphicsView->height()-111;
    sceneW = ui->graphicsView->width()-1;
    sceneH = ui->graphicsView->height()-1;
    ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    //sceneVis = new QGraphicsScene(ui->graphicsView);
    //sceneVis->setBackgroundBrush(QBrush(Qt::black));

    scene = new QGraphicsScene(ui->graphicsView);
    scene->setBackgroundBrush(QBrush(Qt::black));


    pen = QPen(Qt::white);
    pen.setWidth(2);

    //DrawAxes();

    step = (sceneW-leftTab)/numOfPikets;

    UpdateDiagram(raildata,diagramdata_,profile_,traindata);

    //ui->graphicsView->setScene(sceneVis);
    ui->graphicsView->setScene(scene);
}

RailDiagram::~RailDiagram()
{
    delete ui;
}

void RailDiagram::UpdateDiagram(RailwayDataStruct raildata, RailDiagramStruct diagram,
                                RailProfileStruct profile, TrainDataStruct traindata)
{
    diagramdata_ = diagram;
    profile_ = profile;
    //scene = new QGraphicsScene(ui->graphicsView);
    //scene->setBackgroundBrush(QBrush(Qt::black));
    for(int i=0;i<scene->items().size();i++)
            scene->removeItem(scene->items().at(i));

    DrawAxes();
    DrawSpeedLimits();
    DrawSpeedDiagram();
    DrawCalculatedSpeedLimit();
    DrawLabels();
    DrawMileStones();
    DrawObjects();
    DrawProfileScale();
    DrawProfileDiagram();
    PutObjectsIcons();
    ShowAverageProfiles();

    //sceneVis = scene;
    //ui->graphicsView->setScene(sceneVis);
    ui->graphicsView->setScene(scene);
}

void RailDiagram::DrawAxes()
{
    scene->addLine(leftTab,0,leftTab,sceneH-5,pen); //y axe
    scene->addLine(leftTab,diagramH,sceneW,diagramH,pen);    //x axe

    for(int i=0;i<11;i++){//vertical scale
        int scale = diagramdata_.maxSpeed/10;
        QGraphicsTextItem* txt = new QGraphicsTextItem;
        if(i%2==0){
            if(i==0)txt->setPos(5,diagramH - i*diagramH/10-20);
            else if(i<10)txt->setPos(5,diagramH - i*diagramH/10-15);
            else txt->setPos(5,0);
            txt->setTextWidth(40);
            txt->setFont(QFont("Arial",12));
            txt->setDefaultTextColor(Qt::white);
            txt->setHtml("<div align='right'>"+QString::number(i*scale)+"</div>");
            scene->addItem(txt);
        }

        if(i>0 && i<10){
            scene->addLine(leftTab,diagramH - i*diagramH/10,leftTab+15,diagramH - i*diagramH/10,pen);
            scene->addLine(leftTab,diagramH - i*diagramH/10-3,leftTab+15,diagramH - i*diagramH/10-3,pen);
        }
    }
}

void RailDiagram::DrawSpeedLimits()
{
    for(int i=0;i<diagramdata_.speedLimits.size();i++){
        int x1 = leftTab+(headOfTrain*100+diagramdata_.speedLimits[i].distance)/100*step;
        int w1;
        if(i<diagramdata_.speedLimits.size()-1)
            w1 = (diagramdata_.speedLimits[i+1].distance - diagramdata_.speedLimits[i].distance)/100*step;
        else
            w1 = sceneW-leftTab-diagramdata_.speedLimits[i].distance/100*step;
        qreal h1 = diagramH-diagramH*diagramdata_.speedLimits[i].limitValue/diagramdata_.maxSpeed;
        QGraphicsRectItem* rect = new QGraphicsRectItem(x1,0,w1,h1);
        rect->setBrush(QBrush(Qt::lightGray));
        rect->setPen(pen);
        scene->addItem(rect);
        scene->addLine(x1+w1,0,x1+w1,diagramH,pen);
        QGraphicsTextItem* txt = new QGraphicsTextItem;
        txt->setTextWidth(w1);
        txt->setDefaultTextColor(Qt::white);
        txt->setFont(QFont("Arial",24));
        txt->setHtml("<div align='center'>"+QString::number(diagramdata_.speedLimits[i].limitValue)+"</div>");
        txt->setPos(x1,h1/2-24);
        scene->addItem(txt);
    }
}

void RailDiagram::DrawSpeedDiagram()
{
    scene->addLine(headOfTrain*step+leftTab,0,headOfTrain*step+leftTab,sceneH,pen);//virtical line which shows current point
    QPen penGreen(Qt::green);
    penGreen.setWidth(2);
    for(int i=0;i<diagramdata_.backSpeedsMasiive.size()-1;i++){
        if(diagramdata_.backSpeedsMasiive[i]!=quint8(0xFF)){
            qreal y1 = diagramH-diagramH*(qreal)diagramdata_.backSpeedsMasiive[i]/diagramdata_.maxSpeed;
            qreal y2 = diagramH-diagramH*(qreal)diagramdata_.backSpeedsMasiive[i+1]/diagramdata_.maxSpeed;
            qreal x1 = leftTab+(headOfTrain-i)*step;
            qreal x2 = leftTab+(headOfTrain-i-1)*step;
            scene->addLine(x1,y1,x2,y2,penGreen);
        }
    }

    QPen penGray(Qt::gray);
    penGray.setWidth(2);
    for(int i=0;i<diagramdata_.calcSpeedsMassive.size()-1;i++){
        if(diagramdata_.calcSpeedsMassive[i]!=quint8(0xFF)){
            qreal y1 = diagramH-diagramH*(qreal)diagramdata_.calcSpeedsMassive[i]/diagramdata_.maxSpeed;
            qreal y2 = diagramH-diagramH*(qreal)diagramdata_.calcSpeedsMassive[i+1]/diagramdata_.maxSpeed;
            qreal x1 = leftTab+i*step;
            qreal x2 = leftTab+(i+1)*step;
            scene->addLine(x1,y1,x2,y2,penGray);
        }
    }
}

void RailDiagram::DrawCalculatedSpeedLimit()
{
    if((diagramdata_.calculatedSpeedLimit<quint8(160))&&diagramdata_.calculatedSpeedLimit!=quint8(0xFF)){
        QPen penYellow(Qt::yellow);
        QVector<qreal> dashes;

        dashes << 8 << 5;

        penYellow.setDashPattern(dashes);
        penYellow.setWidth(2);
        penYellow.setStyle(Qt::CustomDashLine);
        qreal x = diagramH-diagramH*(qreal)diagramdata_.calculatedSpeedLimit/diagramdata_.maxSpeed;
        scene->addLine(leftTab,x,sceneW,x,penYellow);
    }
}


void RailDiagram::DrawObjects()
{
    for(int i=0;i<diagramdata_.objects_.size();i++){
        int distanceInPikets;
        if(diagramdata_.objects_[i].objectType==0){
            distanceInPikets = diagramdata_.objects_[i].distance/piket;
            scene->addEllipse((headOfTrain+distanceInPikets)*step+leftTab,diagramH-21,6,6,QPen(Qt::black),QBrush(Qt::yellow));
            scene->addEllipse((headOfTrain+distanceInPikets)*step+leftTab,diagramH-14,6,6,QPen(Qt::black),QBrush(Qt::green));
            scene->addEllipse((headOfTrain+distanceInPikets)*step+leftTab,diagramH-7,6,6,QPen(Qt::black),QBrush(Qt::red));
        }
        else{
            distanceInPikets = diagramdata_.objects_[i].distance/piket;
            scene->addRect((headOfTrain+distanceInPikets-2)*step+leftTab,diagramH-5,step*4,5,QPen(Qt::darkGray),QBrush(Qt::darkGray));
        }
    }
    int lenPoints = diagramdata_.trainLen/100;
    scene->addRect((headOfTrain-lenPoints)*step+leftTab,diagramH-7,
                   lenPoints*step,7,
                   QPen(Qt::lightGray),QBrush(Qt::lightGray));

}

void RailDiagram::DrawLabels()
{
    QList<QGraphicsTextItem*> trafficLights;
    QList<QGraphicsTextItem*> stations;

    for(int i=0;i<diagramdata_.objects_.size();i++){
        int distanceInPikets = diagramdata_.objects_[i].distance/piket;
        QGraphicsTextItem* label = new QGraphicsTextItem;
        label->setDefaultTextColor(Qt::black);

        QByteArray btr;
        for(int j=0;j<sizeof(diagramdata_.objects_[i].objectName);j++)
            btr += diagramdata_.objects_[i].objectName[j];
        QTextCodec *codec = QTextCodec::codecForName("Windows-1251");

        QString name = codec->toUnicode(btr);


        label->setHtml("<div style='background-color:#FFFFFF;'>" + name.trimmed() + "</div>");
        int wlbl = label->boundingRect().width();

        if(diagramdata_.objects_[i].objectType==0){
            label->setPos((headOfTrain+distanceInPikets)*step+leftTab-wlbl/2,diagramH-65);
            trafficLights.append(label);
        }
        else{
            stations.append(label);
            label->setPos((headOfTrain+distanceInPikets)*step+leftTab-wlbl/2,diagramH-45);
        }
        //scene->addItem(&labels[i]);
    }
    trafficLights = RemoveCollisions(trafficLights,65);
    for(int i=0;i<trafficLights.size();i++){
        scene->addItem(trafficLights[i]);
    }
    stations = RemoveCollisions(stations,45);
    for(int i=0;i<stations.size();i++){
        scene->addItem(stations[i]);
    }
}

QList<QGraphicsTextItem*> RailDiagram::RemoveCollisions(QList<QGraphicsTextItem*> labels, int h)
{
    int i=0,j=labels.size();
    int hasCollis=0;
    while(i<int(j/2)){
        if(labels[i]->pos().x()+labels[i]->boundingRect().width()+2>labels[i+1]->pos().x()){
            if(labels[i+1]->pos().x()-labels[i]->boundingRect().width()<leftTab){
                labels.removeAt(i);
                j--;
            }
            else
                labels[i]->setPos(labels[i+1]->pos().x()-labels[i]->boundingRect().width()-2,diagramH-h);
            hasCollis++;
        }
        i++;
        j--;
        if(labels[j]->pos().x()<labels[j-1]->pos().x()+labels[j-1]->boundingRect().width()+2){
            int x1 = labels[j-1]->pos().x()+labels[j-1]->boundingRect().width()+2;
            labels[j]->setPos(x1,diagramH-h);
            hasCollis++;
        }

    }
    if(hasCollis>0)labels=RemoveCollisions(labels,h);
    return labels;
}

void RailDiagram::DrawMileStones()
{
    QPen penThin(Qt::white);    
    for(int i=0;i<diagramdata_.fissuresMassive.size();i++){
        int x=(headOfTrain+(diagramdata_.fissuresMassive[i].distance/100))*step+leftTab;
        if(diagramdata_.fissuresMassive[i].fissureType==2){
            scene->addLine(x,sceneH-20,x,diagramH-20,pen);
            QGraphicsTextItem* txt = new QGraphicsTextItem;
            txt->setDefaultTextColor(Qt::white);
            txt->setFont(QFont("Arial",10));
            txt->setPlainText(QString::number(diagramdata_.fissuresMassive[i].km));
            if(x+txt->boundingRect().width()>sceneW) txt->setPos(x-txt->boundingRect().width(),diagramH-40);
            else txt->setPos(x-txt->boundingRect().width()/2,diagramH-40);
            scene->addItem(txt);
        }
        else if(diagramdata_.fissuresMassive[i].fissureType==3)scene->addLine(x,sceneH-20,x,diagramH-10,pen);
        else scene->addLine(x,sceneH-20,x,diagramH-6,penThin);
    }
}



void RailDiagram::DrawProfileScale()
{
    for(int i=0;i<5;i++){
        int minHigh = sceneH-25;
        int maxHigh = sceneH-110;
        scene->addLine(leftTab,minHigh - i*(minHigh-maxHigh)/5,leftTab+15,minHigh - i*(minHigh-maxHigh)/5,pen);
        scene->addLine(leftTab,minHigh - i*(minHigh-maxHigh)/5-3,leftTab+15,minHigh - i*(minHigh-maxHigh)/5-3,pen);
        scene->addLine(leftTab+15,minHigh - i*(minHigh-maxHigh)/5-2,sceneW,minHigh-i*(minHigh-maxHigh)/5-2,QPen(Qt::white));

        QGraphicsTextItem* txt = new QGraphicsTextItem;
        txt->setPos(5,minHigh);
        txt->setTextWidth(40);
        txt->setFont(QFont("Arial",12));
        txt->setDefaultTextColor(Qt::white);
        txt->setHtml("<div align='right'>"+QString::number(profile_.minProfileHeight)+"</div>");
        scene->addItem(txt);

        QGraphicsTextItem* txt2 = new QGraphicsTextItem;
        txt2->setPos(5,maxHigh);
        txt2->setTextWidth(40);
        txt2->setFont(QFont("Arial",12));
        txt2->setDefaultTextColor(Qt::white);
        txt2->setHtml("<div align='right'>"+QString::number(profile_.maxProfileHeight)+"</div>");
        scene->addItem(txt2);
    }
}

void RailDiagram::DrawProfileDiagram()
{
    QPainterPath path;
    path.setFillRule(Qt::WindingFill);
    path.moveTo(leftTab,sceneH-20);

    for(int i=0;i<=numOfPikets;i++){
        qreal high = (profile_.heights[i]*profileH)/profile_.maxProfileHeight;
        path.lineTo(leftTab+i*step,sceneH-high);
    }
    path.lineTo(sceneW,sceneH-20);
    path.lineTo(leftTab,sceneH-20);

    scene->addPath(path,QPen(Qt::lightGray),QBrush(Qt::lightGray));


    QPainterPath train;
    train.setFillRule(Qt::OddEvenFill);
    int lenPoints = profile_.trainLen/100;
    qreal high = profile_.heights[headOfTrain-lenPoints]*profileH/profile_.maxProfileHeight;
    train.moveTo((headOfTrain-lenPoints)*step+leftTab,sceneH-high);
    for(int i=headOfTrain-lenPoints;i<=headOfTrain;i++){
        qreal high = (profile_.heights[i]*profileH)/profile_.maxProfileHeight;
        train.lineTo(leftTab+i*step,sceneH-high);
    }
    QPen trainPen(Qt::green);
    trainPen.setWidth(5);
    scene->addPath(train, trainPen,QBrush(Qt::NoBrush));
}

void RailDiagram::PutObjectsIcons()
{
    QList<QGraphicsPixmapItem*> pixmaps;
    for(int i=0;i<profile_.railObject.size();i++){
        QString img;
        switch (profile_.railObject[i].objectType){
            case 0:
            case 1:
            case 3:
            case 12:
            case 14:img = "";break;
            case 2: img = ":/autopilotimg/ktsm.png";break;
            case 4: img = ":/autopilotimg/autocrossing.png";break;
            case 5: img = ":/autopilotimg/bridge.png";break;
            case 6: img = ":/autopilotimg/tonnel.png";break;
            case 7: img = ":/autopilotimg/gas.png";break;
            case 8: img = ":/autopilotimg/danger.png";break;
            case 9: img = ":/autopilotimg/crossing.png";break;
            case 10:img = ":/autopilotimg/crossover.png";break;
            case 11:img = ":/autopilotimg/signal.png";break;
            case 13:img = ":/autopilotimg/controlkit.png";break;
            case 15:img = ":/autopilotimg/braketesting.png";break;

        }
        if(img.size()>0){
            QGraphicsPixmapItem* pixmap = scene->addPixmap(QPixmap(img));
            int x = leftTab+(profile_.railObject[i].distance/100+headOfTrain)*step;
            pixmap->setPos(x,sceneH-70);
            pixmaps.append(pixmap);
        }
        }
    RemoveIconsCollisions(pixmaps);
}

void RailDiagram::RemoveIconsCollisions(QList<QGraphicsPixmapItem*>pixmaps)
{
    for(int i=0;i<pixmaps.size()-1;i++){
        if(pixmaps[i]->pos().x()+pixmaps[i]->boundingRect().width()>pixmaps[i+1]->pos().x()){
            int x = pixmaps[i+1]->pos().x();
            pixmaps[i+1]->setPos(x, sceneH-100);
            i++;
        }
    }
}

void RailDiagram::ShowAverageProfiles()
{
    for(int i=0;i<profile_.averageProfileMassive.size()-1;i++){
        int x = leftTab+(headOfTrain+profile_.averageProfileMassive[i].distance/100)*step;
        scene->addLine(x,sceneH,x,sceneH-profileH,QPen(Qt::white));
        int x2 = leftTab+(headOfTrain+profile_.averageProfileMassive[i+1].distance/100)*step;
        QGraphicsTextItem* txt = new QGraphicsTextItem;
        txt->setTextWidth(x2-x);
        txt->setDefaultTextColor(Qt::white);
        txt->setFont(QFont("Arial",12));
        txt->setHtml("<div align='center' size='5'>"+QString::number((qreal)profile_.averageProfileMassive[i].value/10)+"</div>");
        txt->setPos(x,sceneH-25);
        scene->addItem(txt);
    }
    QGraphicsTextItem* txt = new QGraphicsTextItem;
    txt->setDefaultTextColor(Qt::white);
    txt->setFont(QFont("Arial",12));
    txt->setHtml("<div align='center' size='5'>‰</div>");
    txt->setPos(sceneW-20,sceneH-25);
    scene->addItem(txt);
}




Такое ощущение что элементы может и удаляются, но на экране затираются частично.

Это сообщение отредактировал(а) Atiskara - 26.6.2014, 07:16
PM MAIL   Вверх
Avazart
Дата 27.6.2014, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



Нафига мне код я что его набирать буду,? я просил проект где заметно что не работаете момент с удалением.
Код

scene->update() ;

Сразу после удаления не пробовали делать ?

Это сообщение отредактировал(а) Avazart - 27.6.2014, 17:25
PM MAIL   Вверх
Amp
Дата 27.6.2014, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Почему бы просто не вызвать метод clear()?
PM MAIL   Вверх
Atiskara
Дата 30.6.2014, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Цитата(Avazart @ 27.6.2014,  17:24)
Нафига мне код я что его набирать буду,? я просил проект где заметно что не работаете момент с удалением.
Код

scene->update() ;

Сразу после удаления не пробовали делать ?

Попробовала. Работает. Спасибо.

Добавлено через 1 минуту и 24 секунды
Цитата(Amp @ 27.6.2014,  17:33)
Почему бы просто не вызвать метод clear()?

а как все просто то оказывается, и вам спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.