Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ Цвет линий графика

Автор: AD 25.4.2008, 10:45

Цвета линий читаются из файла и записываются в вектор. Вид записи: #RRGGBB или стандартно-определенные (red, blue, etc). Записываю этот цвет в QColor. При чтении на другом куске кода почему-т все время выдается черный цвет. как от это бага избавится?
Вот кусок записи кода:

void DlgNameReader::initColor(QString* rec)
{
    /// Кое-какой код
    dname_vec[dname_vec.size() - 2].setColor(str_right);
    dname_vec[dname_vec.size() - 1].setPrMin(dname_vec[dname_vec.size() - 2].getPrMin());
    dname_vec[dname_vec.size() - 1].setPrMax(dname_vec[dname_vec.size() - 2].getPrMax());
            }
        }
    }


Вот присвоение уже QColor:
for(vector<Reader::DName>::iterator jter=dist_vec -> begin(); jter!=dist_vec -> end(); ++jter)
    if(jter -> getPrName() == parameter -> Name().c_str() && jter -> getAddress() == parameter -> Address())
    {
        QString s_color = jter -> getColor();
        clr = QColor(s_color);
        break;
    }
    QFactParam inParam(parameter, DISTPARAM, &clr);
    if(check -> isChecked())
        fact_prm.push_back(inParam);


А вот здесь все время выдается #000000:
QString color = fact_prm[id].param_color -> name();
painter -> setPen(*fact_prm[id].param_color);
painter -> drawPolyline(polyline);

Автор: ViGOur 25.4.2008, 10:53

Я бы на твоем месте сдела не vector<QFactParam>, а vector<QFactParam*>. :)

Автор: AD 25.4.2008, 10:56

Цитата(ViGOur @ 25.4.2008, 11:53) *
Я бы на твоем месте сдела не vector<QFactParam>, а vector<QFactParam*>. :)

а в чем большая разница-то?

Автор: ViGOur 25.4.2008, 12:22

У тебя будет происходить куча операций копирования.
Посмотри на результат работы данного кода. :)

#include <QtCore/QCoreApplication>

#include <vector>
using namespace std;

class CTest
{
    int m_nTmp;
    static int m_n;
public:
    CTest();
    CTest( const CTest &r);
    virtual ~CTest();

    int GetValue()const;
};

int CTest::m_n=0;

CTest::CTest()
{
    m_nTmp=m_n;
    qDebug( "CTest: %d", m_n);
    m_n++;
}

CTest::CTest( const CTest &r)
{
    qDebug( "CTest( const CTest &): %d, Value: %d", m_n, r.m_nTmp);
    m_n++;
    this->m_nTmp = r.m_nTmp;
}

CTest::~CTest()
{
    m_n--;
    qDebug( "~CTest: %d", m_n);
}

int CTest::GetValue()const
{
    return m_nTmp;
}

void f2( vector<CTest> &v)
{
    for( int n = 0; n < 10; n++)
    {
        CTest test;
        v.push_back( test);
    }
}

void f1()
{
    vector<CTest> v;
    //v.reserve( 10);

    f2( v);

    vector<CTest>::iterator pIter;
    for( pIter=v.begin(); pIter!=v.end(); pIter++)
    {
        qDebug( "Value: %d", pIter->GetValue());
    }
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    f1();
    
    return a.exec();
}
Я его для примера написал. :)

Автор: Andrew Selivanov 25.4.2008, 12:30

Цитата(AD @ 25.4.2008, 11:45) *
Вот присвоение уже QColor:
for(vector<Reader::DName>::iterator jter=dist_vec -> begin(); jter!=dist_vec -> end(); ++jter)
    if(jter -> getPrName() == parameter -> Name().c_str() && jter -> getAddress() == parameter -> Address())
    {
        QString s_color = jter -> getColor();
        clr = QColor(s_color);
        break;
    }
    QFactParam inParam(parameter, DISTPARAM, &clr);
    if(check -> isChecked())
        fact_prm.push_back(inParam);


У тебя цикл for только для первого if, остальное почему-то на том же уровне, но выполняется оно не в цикле.

Автор: AD 25.4.2008, 13:34

Цитата(ViGOur @ 25.4.2008, 13:22) *
У тебя будет происходить куча операций копирования.
Посмотри на результат работы данного кода. :)
Я его для примера написал. :)

Посмотрел код, действительно некрасиво. Но как это к моему случаю относится? Можно пример правильного кода относительно моей программы! Заранее благодарю!

Автор: ViGOur 25.4.2008, 14:00

for(vector<Reader::DName>::iterator jter=dist_vec -> begin(); jter!=dist_vec -> end(); ++jter)
{
    if(jter -> getPrName() == parameter -> Name().c_str() && jter -> getAddress() == parameter -> Address())
    {
        QString s_color = jter -> getColor();
        clr = QColor(s_color);
        break;
    }
    QFactParam *inParam=new QFactParam(parameter, DISTPARAM, &clr);
    if(check -> isChecked())
        fact_prm.push_back( inParam);
}
Соответственно в коде исправляешь vector<QFactParam> на vector<QFactParam*>...

Автор: Litkevich Yuriy 25.4.2008, 16:04

Цитата(' date='25.4.2008, 14:56) *
в чем большая разница-то?

вектор это же контейнер, а в Qt4 в контейнер рекомендуют только указатели класть, если я ничего не путаю.

Автор: ViGOur 25.4.2008, 16:26

В данном случае используется не Qt'шный QVector, а STL vector. Но в принципе желательно также использовать указатели.

Автор: Tonal 28.4.2008, 10:25

По приведённому тобой коду нельзя сказать где ошибка.
Несколько уточняющих вопросов:
1) Во втором куске кода, где и как определено имя clr?
2) Покажи конструктор, QFactParam который там вызывается.
3) Второй и 3ий кусок кода как распологаются друг относительно друга (в одном блоке, в одной процедуре, в одном классе...)?

Предположение, основанное на телепатии - в QFactParam ты запоминаешь адрес локального объекта, который разрушается при выходе из блока, а используешь этот адрес совсем в другой функции. :)

По поводу хранения в векторах объектов и указателей - правильно использовать то, что нужно для задачи, а не что попало. :)

Автор: AD 28.4.2008, 17:28

Цитата(Tonal @ 28.4.2008, 11:25) *
По приведённому тобой коду нельзя сказать где ошибка.
Несколько уточняющих вопросов:
1) Во втором куске кода, где и как определено имя clr?
2) Покажи конструктор, QFactParam который там вызывается.
3) Второй и 3ий кусок кода как распологаются друг относительно друга (в одном блоке, в одной процедуре, в одном классе...)?

Предположение, основанное на телепатии - в QFactParam ты запоминаешь адрес локального объекта, который разрушается при выходе из блока, а используешь этот адрес совсем в другой функции. :)

1)
QColor clr;

for(paramI iter=graphic -> mainWindow -> cur_rec.begin(); iter!=graphic -> mainWindow -> cur_rec.end(); ++iter)
     if((*iter) -> Name() == prm_name.toStdString() && (*iter) -> Address() == iadr)
     {
/// etc

2)
 
QFactParam(): param_record(NULL), param_color(NULL), type(NOTYPE) {}
    QFactParam(ParamDescr* _pr, TP_PARAM _tp, QColor* _cl = &QColor(Qt::black)): param_record(_pr), type(_tp),
                            param_color(_cl) {}
    QFactParam(const QFactParam& _qf) { *this = _qf; }

3) 2-ой и 3-ий куски кода в 1 посте располагаются в разных файлах, вектор QFactParams виден глобально!

Автор: Tonal 29.4.2008, 7:31

Не хватает определения param_color.
Оно выглядит так?

QColor* param_color?


Но всё таки, мне кажется, что мая телепатия меня не подвела. :)

Ты запоминаешь в векторе fact_prm указатель на локальную переменную.
Догадайся, куда он будет указывать при выходе из функции?

Исправить - просто. Вместо указателя на QColor везде используй само значение. В параметрах конструктора вместо QColor* пиши const QColor& и будет тебе щастье. :)

Автор: AD 29.4.2008, 8:49

Цитата(Tonal @ 29.4.2008, 8:31) *
Не хватает определения param_color.
Оно выглядит так?
QColor* param_color?


Но всё таки, мне кажется, что мая телепатия меня не подвела. :)

Ты запоминаешь в векторе fact_prm указатель на локальную переменную.
Догадайся, куда он будет указывать при выходе из функции?

Исправить - просто. Вместо указателя на QColor везде используй само значение. В параметрах конструктора вместо QColor* пиши const QColor& и будет тебе щастье. :)

Вах-вах! Какая глупая ошибка. Спасибо! Действительно помогло - убрать указатель! :)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)