Russian Qt Forum
Июля 04, 2025, 03:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 115 116 [117] 118 119 ... 140
1741  Qt / 2D и 3D графика / Re: оптимизация paint() QGraphicsItem'а : Марта 18, 2011, 22:05
Хм..
Цитировать
Код
C++ (Qt)
void PolarAxis::paint(QPainter *p, const QStyleOptionGraphicsItem *option,QWidget *widget)
{
   p->setMatrix(scale_matrix);
   p->drawEllipse(x-rad,y-rad,rad*2,rad*2);
   p->drawLine(x,y,x,y-rad);
 
   QPen *dotPen=new QPen(Qt::DashDotLine); // Зачем?
   dotPen->setWidthF(0.3);
   QVector<qreal> dashes;
   dashes <<10 <<10;
   dotPen->setDashPattern(dashes);
   p->setPen(*dotPen);
 
   for (int i=rad-15;i>0;i-=15)
        p->drawEllipse(x-i,y-i,i*2,i*2);
        for (int i=0; i>-360; i-=10){
            p->drawLine(x,y,x+rad*cos(i*pi/180),y+rad*sin(i*pi/180));
            double x2=x+(rad+20)*cos(i*pi/180+90*pi/180+rotate*pi/180)-15;
            double y2=y+(rad+20)*sin(i*pi/180+90*pi/180+rotate*pi/180)-7.5;
            p->drawText(x2,y2,30,15,Qt::AlignCenter,QString("%1").arg(abs(i)));
        }
}
 
Во-первых зачем создавать dotPen в куче?
Во-вторых из-за него у вас утечка, поскольку не видно где он уничтожается
В-третьих
Цитировать
Код
C++ (Qt)
void PolarPlot::resizeEvent(QResizeEvent *re)
{
       QRect *rct=new QRect(0,0,re->size().height()-25,re->size().width()-25); // Те же грабли
       plotScene->setSceneRect(*rct);
       double h1=re->size().height();
       double h2=re->oldSize().height();
       double koef=h1/h2;
       pa->rescale(koef);   //в pa объект класса PolarAxis
 
}
 
всё сказанное выше, но приминительно к rct

А теперь представте, что будет при интенсивном ресайзе и отрисовки..
1742  Программирование / С/C++ / Re: Как сделать кратко/красиво : Марта 15, 2011, 23:25
Это должно быть по быстрее Подмигивающий
1743  Программирование / С/C++ / Re: Как сделать кратко/красиво : Марта 15, 2011, 23:17
Цитировать
Не въехал с сынтаксысом. Вроде "начальное значение" для accumulate обязательно,
Да, попутал))

Вот окончательно:
Код
C++ (Qt)
class MyFunctor
{
public:
   CMesh * operator()(CMesh *a, CMesh *b) {
       if ((a->mFriction == b->mFriction) && (a->mFriction == m_unique_friction.back()) && m_tag)
      {
           a->Append(b);
           b->Clear();
       }
        return a;
   }
 
bool frictionIsContains(float f) {
   vector<float>::iterator it = find(m_unique_friction.begin(), m_unique_friction.end(), f);
   if (it == m_unique_friction.end()) {
       m_unique_friction.push_back(f);
       m_tag = true;
       return !m_tag;
   }
    m_tag = false;
    return !m_tag;
}
private:
vector<float> m_unique_friction;
bool m_tag;
};
 
void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtrVec & shape )
{
   TMeshPtrVec::iterator it = mesh.begin();
   MyFunctor func;
    for (; it != mesh.end(); ++it) {
       if (func.frictionIsContains((*it)->mFriction))
           continue;
       CMesh *cm = accumulate(it, mesh.end(), *it,  func);
       shape.push_back(cm->CreateShape());
   }
}
 
1744  Программирование / С/C++ / Re: Как сделать кратко/красиво : Марта 15, 2011, 22:35
Тогда как вариант:
Код
C++ (Qt)
class MyFunctor
{
public:
   CMesh * operator()(CMesh *a, CMesh *b) {
       if ((a->mFriction == b->mFriction) && (a->mFriction == m_unique_friction.back()) && m_tag)
      {
           a->Append(b);
           b->Clear();
           return a;
       }
        return 0;
   }
 
bool frictionIsContains(float f) {
   vector<double>::iterator it = find(m_unique_friction.begin(), m_unique_friction.end(), f);
   if (it != m_unique_friction.end()) {
       m_unique_friction.push_back(f);
       m_tag = true;
       return m_tag;
   }
    m_tag = false;
    return m_tag;
}
private:
vector<float> m_unique_friction;
bool m_tag;
};
 
void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtrVec & shape )
{
   TMeshPtrVec::iterator it = mesh.begin();
   MyFunctor func;
    for (; it != mesh.end(); ++it) {
       if (!func.frictionIsContains((*it)->mFriction))
           continue;
       CMesh *cm = accumulate(it, mesh.end(), func);
       shape.push_back(cm->CreateShape());
   }
}
 
 
1745  Программирование / С/C++ / Re: Как сделать кратко/красиво : Марта 15, 2011, 21:44
Можно непосредственно в функции myBinaryPredicate "сливать" данные из одного (a) в другой (b) (с помощью Append), если они равны.
Может даже это и будет работать (не знаю), но делать такие "масштабные" действия в ф-ции предназначенной просто для сравнения - никак не гуд.
Почему эт? Это всё равно придётся делать) Кстати, зачем тогда придумали ещё и объекты функций?
Правильно, для большей гибкости.

Цитировать
Да и копирование вектора (с последующим resize) хорошего впечатления не производит. Нельзя сделать как-то "через голову", не слишком привлекая мутность STL?
Да он всё равно локален и разрушится при выходе из функции.
Сколько там (в mesh) в среднем элементов планируется держать?

Если без этого временного вектора v, то тогда лучше использовать find_if, но это будет медленее и так кратко не думаю что получится. 
1746  Программирование / С/C++ / Re: Как сделать кратко/красиво : Марта 15, 2011, 21:05
В смысле долит? Этот код создаёт только вектор с указателями на уникальные mFriction.. Он ничё никуда не доливает) 
Ну а зачем такой вектор нужен? Ведь задача объединить (с помощью Append) подходящие элементы и создать для них одну CShape.
Можно непосредственно в функции myBinaryPredicate "сливать" данные из одного (a) в другой (b) (с помощью Append), если они равны.

Цитировать
Кстати о птичках: если уж создавать вектор уникальных, то не лучше ли сначала отсортировать, а затем один раз вызвать unique_copy (а то увлеклись списыванием  Улыбающийся)

Можно, конечно) Я просто Вашу бдительность проверял))
1747  Программирование / С/C++ / Re: Как сделать кратко/красиво : Марта 15, 2011, 20:47
Хотя я это не проверял)
Та вижу что нет  Улыбающийся
Пусть первые 2 элемента имеют одинаковый ключ (mFriction). Тогда, если я правильно понимаю, unique_copy поместит в выходной вектор лишь первый из них, второй не будет долит к первому - а должен
В смысле долит? Этот код создаёт только вектор с указателями на уникальные mFriction.. Он ничё никуда не доливает)  

Если я правильно понимаю, то доливание одного вектора в другой, если у них одинаковые mFriction можно произвести в myBinaryPredicate...
1748  Программирование / С/C++ / Re: Как сделать кратко/красиво : Марта 15, 2011, 20:17
Ну вот, например:
Код
C++ (Qt)
bool myBinaryPredicate(CMesh* a, CMesh* b) {
   return (a->mFriction == b->mFriction);
}
 
bool compare (CMesh* a, CMesh* b) {
   return (a->mFriction < b->mFriction);
}
 
 
void CMesh::CreateShapes( TMeshPtrVec & mesh, TShapePtrVec & shape )
{
    TMeshPtrVec v = mesh;
    TMeshPtrVec::iterator it = unique_copy (mesh.begin(), mesh.end(), v.begin(), myBinaryPredicate);
    sort (v.begin(), it, compare);
    it=unique_copy (v.begin(), it, v.begin(), myBinaryPredicate);
    v.resize( it - v.begin());
/* v - теперь содержит указатели на CMesh c уникальными значениями mFriction */
/* Дальше все действия с ним..  */
}
 

Хотя я это не проверял)
1749  Разное / Объявления / Re: Симпатичная работа ищет программиста PHP для серьезных отношений : Марта 15, 2011, 18:11
web-it, а сказать что за город, не? Или тут все по определению должны быть питерские-московские-бобруйские?
Адрес:   г. Москва, Проспект Мира, дом 101В, строение 2, этаж 3
1750  Программирование / С/C++ / Re: Как сделать кратко/красиво : Марта 15, 2011, 17:05
Я бы посмотрел в сторону алгоритма find_if, в сочетании с count_if

Или вот, пожалуй, лучше всего подходит под это дело:
http://www.cplusplus.com/reference/algorithm/unique_copy/
 
1751  Qt / Вопросы новичков / Re: При наведении мыши... : Марта 14, 2011, 21:53
Поле из 100 кнопок..
И при движение мыши это всё ещё и мигает белое-чёрное, белое-чёрное..
Интересно))
Бредовая догадка: не морской бой часом?

Приз в студию! Да, морской бой Улыбающийся По программированию задали

Насчет кнопок - разобрался. Конечно, скорость не ахти, но уже времени нет оптимизировать код)

Элементарно, Ватсон.. Вы уже об этом упоминали ранее.
Кнопки - это не самый лучший вариант.
1752  Qt / Вопросы новичков / Re: При наведении мыши... : Марта 14, 2011, 21:06
Поле из 100 кнопок..
И при движение мыши это всё ещё и мигает белое-чёрное, белое-чёрное..
Интересно))
Бредовая догадка: не морской бой часом?
1753  Qt / Вопросы новичков / Re: Как перевести из QString в Qt::PenStyle : Марта 14, 2011, 19:42
Судя по всему, чувак просто хочет сохранять настройки, в частности Qt::PenStyle, через QSettings и доставать их потом при загрузке..
Хотя в соседней теме вроде уже ответели на этот вопрос  Непонимающий

   
1754  Qt / Вопросы новичков / Re: Как перевести из QString в Qt::PenStyle : Марта 14, 2011, 19:03
...есть какой-то нетривиальный способ через QMetaEnum добраться до пропертей из неймспейса Qt.
Ну ну...  Смеющийся
Авварон, мне нравится ваше чувство юмора)
1755  Qt / Вопросы новичков / Re: Как перевести из QString в Qt::PenStyle : Марта 14, 2011, 17:43
Здравствуйте не подскажите как перевести из QString в Qt::PenStyle

reinterpret_cast попробуй))
Код
C++ (Qt)
Qt::PenStyle penStyle = reinterpret_cast<Qt::PenStyle>(str);
 
Страниц: 1 ... 115 116 [117] 118 119 ... 140

Страница сгенерирована за 0.065 секунд. Запросов: 21.