crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Цвет линий графика, неясно почему не устанавливается
AD
  опции профиля:
сообщение 25.4.2008, 10:45
Сообщение #1


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цвета линий читаются из файла и записываются в вектор. Вид записи: #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);


Сообщение отредактировал AD - 25.4.2008, 10:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 25.4.2008, 10:53
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Я бы на твоем месте сдела не vector<QFactParam>, а vector<QFactParam*>. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 25.4.2008, 10:56
Сообщение #3


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


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

а в чем большая разница-то?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 25.4.2008, 12:22
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


У тебя будет происходить куча операций копирования.
Посмотри на результат работы данного кода. :)
#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
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

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




Репутация:   6  


Цитата(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
Сообщение #6


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


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

Посмотрел код, действительно некрасиво. Но как это к моему случаю относится? Можно пример правильного кода относительно моей программы! Заранее благодарю!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 25.4.2008, 14:00
Сообщение #7


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


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
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


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

вектор это же контейнер, а в Qt4 в контейнер рекомендуют только указатели класть, если я ничего не путаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 25.4.2008, 16:26
Сообщение #9


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


В данном случае используется не Qt'шный QVector, а STL vector. Но в принципе желательно также использовать указатели.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 28.4.2008, 10:25
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


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

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

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

Сообщение отредактировал Tonal - 28.4.2008, 10:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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