LINUX.ORG.RU
ФорумTalks

Qt тоже катится в...

 


2

4

Тащемто например:
https://bugreports.qt-project.org/browse/QTBUG-25896
https://bugreports.qt-project.org/browse/QTBUG-26013

Наткнулись в своём проекте. Для Ъ: начиная с 4.8 Qt криво рисует линии. Юзеры слёзно молят разработчиков пофиксить это безобразие, на что те отвечают: «не, это устаревший метод, вообще линии не нужны никому, кроме разве стрелочки рисовать в UI, а для этого у нас есть all brand new Qt5! Рисовать графики? Там точное совпадение линий не нужно.»

Как вкратце это выразил чувак в комментах:
because the whole QWidget/QPainter based interface is obviously seen as deprecated and they want everyone to make shiny blinking interfaces with QML and script JS, instead of /real/ work.

И эти слова можно применить, увы, к любому современному проекту.

Everyone wants to make shiny blinking interfaces instead of real work.

★★★★★

Из уведомлений:

Qt тоже катится в... (Talks)

Именно туда оно и катится.

А вообще обидно, что-то дигия хреново Qt разрбатывает.

keyran ★★
()

/real/ work - отдельно, shiny blinking interfaces - отдельно

Stil ★★★★★
()

Посмотрел на картинки. Судя по всему у qt общая для всего мира болезнь - найм криворуких студентов за еду искренне стремящихся. Но криворуких. При полном отсутствии интереса к тестированию менеджмента.

Скоро так будет вездеВезде так. Просто никто не замечает.

ziemin ★★
()

а еще в КДЕ портировали баг ажиз второго гнома, с неработающими на руской раскладке хоткеями 8)

Deleted
()
Ответ на: комментарий от ziemin

Ну да, я в общем о том же, только другими словами...

queen3 ★★★★★
() автор топика

Может Evas из E17? В настоящий момент программ на нём нет, но говорят что штука хорошая.

ZenitharChampion ★★★★★
()

Похоже проблема DE и API в том, что однажды они достигают предела в развитии функциональности и становятся достаточными. По-хорошему, всё что дальше нужно - это фиксить баги, оптимизировать код, портировать на разные платформы, ну может фичу-другую иногда добавить.

Вместо этого разработчики начинают страдать фигней, чтобы оправдать своё существование. Это случилось с гномом, gui винды, теперь KDE.

anonymous_incognito ★★★★★
()
Последнее исправление: anonymous_incognito (всего исправлений: 2)

залезь в исходники, поправь, да зашли патч.

Dark_SavanT ★★★★★
()

Everyone wants to make shiny blinking interfaces instead of real work.

О да.

thesis ★★★★★
()

Наткнулись в своём проекте. Для Ъ: начиная с 4.8 Qt криво рисует линии.

Можно фрагмент кода, для того, что бы у себя проверить?

MikeDM ★★★★★
()
Ответ на: комментарий от m0rph

Ну он долго не был исправлен, но я его привёл больше как ссылку на цитату про shiny interfaces. Зато во втором уже предложили -graphicssystem raster_v47 ;-)

queen3 ★★★★★
() автор топика
Ответ на: комментарий от MikeDM

Не, мы только наткнулись, изучаем проблему. Вообще-то куски кода есть в жире. Ну а у нас просто тестеры начали создавать баги, что в графиках, например, не всегда совпадают линии с осями, через какое-то время после перехода с 4.7.4 на 4.8.1. Поэтому меня поразил коммент Qt-шного разработчика что, оказывается, «точность отрисовки линий не нужна для графиков».

queen3 ★★★★★
() автор топика
Ответ на: комментарий от anonymous_incognito

Это случилось с гномом,
gui винды

ну если гном я еще могу понять, то в венде гуй всегда был говном. Просто последние 10 лет он стал деградировать, а в восьмерке совсем улетел в психоделические дали

nu11 ★★★★★
()

Рисовать графики? Там точное совпадение линий не нужно.

Я знал, что они дебилы!

Quasar ★★★★★
()
Ответ на: комментарий от Quasar

«Plots and graphs won't really be affected by this change as the exact rounding of lines is typically not a big issue there.» точная цитата

У нас в итоге линии графиков не совпадают с осями.

Ну впрочем, хоть ясно, почему в KDE все ругают мелкие огрехи в ui - то шрифт смещён, то линии неровная, то ещё что.

queen3 ★★★★★
() автор топика

А в чём проблема слепить свой виджет для графиков, коль скоро графики так важны?

fenris ★★★★★
()
Ответ на: комментарий от queen3

скажите, а у нас этот баг наблюдался на х86 и х64 или __только__ на х64?

в fglrx был баг просто с точностью, и именно на х64. лечилось -mno-sse ибо в sse конвертация к целому «в лоб» невозможна с округлением к ближайшему целому, только к ближайшему четному.

ckotinko ☆☆☆
()
Ответ на: комментарий от spoilt

пришли тестовый код. посмотрю. самому скоро это понадобится, не знал что всё так плохо. судя по картинкам, проблема в округлении, sse круглит числа к четному а не просто к целому.

кстати, еще можно включить <xmmintrin.h> и попытаться там попортить режимы округления SSE. если линии поплывут, дело в SSE 146%

ckotinko ☆☆☆
()
Последнее исправление: ckotinko (всего исправлений: 1)

QWidget ничего не угрожает, ага :}

Deleted
()
Ответ на: комментарий от annulen

это последствия нечитания доков по ассемблеру.

я же сказал проблема округления.

http://code.google.com/p/phantomjs/source/browse/src/qt/src/gui/painting/qdra...

static inline Int32x4 v_toInt(Float32x4 x) { return _mm_cvttps_epi32(x); }

ну вот и опаньки. надо на входе в painter ставить округление вниз, и прибавлять заранее припасённую константу {0.5,0.5,0.5,0.5}

ckotinko ☆☆☆
()
Ответ на: комментарий от queen3

попробуйте как временный костыль

#include <xmmintrin.h>
int main(...)
{
    _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN);

    ..your code here..
}

ckotinko ☆☆☆
()

Поделие Qt мертво.

Как турбо паскаль и прочие дельфаи с куликсами и лазарусами.

10 лет назад некоторые клоуны на полном серьезе доказывали, что Qt обгонит по популярности Джаву. (пруф - http://citforum.ru/programming/application/java_qt.shtml )

Сейчас всё - finita la comedia (c).

Bioreactor ★★★★★
()
Ответ на: комментарий от Bioreactor

Qt обгонит по популярности Джаву
пруф - http://citforum.ru/programming/application/java_qt.shtml )

В этой статье сравнивается эффективность использования C++/Qt и Java/AWT/Swing для разработки программного обеспечения с пользовательским графическим интерфейсом.

у тебя мозг рака

wota ★★
()
Ответ на: комментарий от ckotinko

На x86. Qt использует целочисленные расчёты так что не в этом дело.

queen3 ★★★★★
() автор топика

Да не, там вроде виноват код из qcosmeticpainter или как его, а там целочисленные координаты. Но на самом деле точно не скажу, только в пятницу наткнулись и начали изучать.

qcosmeticstroker, обломался я, qreal там.

queen3 ★★★★★
() автор топика
Последнее исправление: queen3 (всего исправлений: 1)
Ответ на: комментарий от queen3

Ну а у нас просто тестеры начали создавать баги, что в графиках, например, не всегда совпадают линии с осями, через какое-то время после перехода с 4.7.4 на 4.8.1.

http://www.qcustomplot.com/documentation/index.html#mainpage-performancetweaks

«use Qt 4.8.0 and up. Performance has doubled or tripled with respect to Qt 4.7.4. However QPainter was broken and drawing pixel precise things, e.g. scatters, isn't possible with Qt >= 4.8.0. So it's a performance vs. plot quality tradeoff when switching to Qt 4.8.»

annulen ★★★★★
()
Ответ на: комментарий от annulen

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

queen3 ★★★★★
() автор топика
Ответ на: комментарий от Bioreactor

Возможно тебя порадует популярность вакансии дворника.

fenris ★★★★★
()
Ответ на: комментарий от queen3

Ну а у нас просто тестеры начали создавать баги, что в графиках, например, не всегда совпадают линии с осями, через какое-то время после перехода с 4.7.4 на 4.8.1. Поэтому меня поразил коммент Qt-шного разработчика что, оказывается, «точность отрисовки линий не нужна для графиков».

Значит надо выбрасывать куски Qt из употребления как ненадёжные - сторонние велосипеды рулят, теже линии можно заменить либой рисующей линии в массив а уж выводить готовую картинку на экран виджеты пока не разучились.

Napilnik ★★★★★
()
Ответ на: комментарий от queen3

я поглядел на изображения «косых» линий, явно бросается в глаза тот факт, что концы линий всегда на четных стобцах и строках пикселей. у нас такой баг был в fglrx, я еще удивлялся сперва, почему настройки округления не влияют на преобразование в целое.

ckotinko ☆☆☆
()
Ответ на: комментарий от queen3

что то у меня не получилось воспроизвести. да и округление там в порядке, соврет максимум на 1/32 пикселя даже с SSE

ckotinko ☆☆☆
()

Для Ъ: начиная с 4.8 Qt криво рисует линии.

В целочисленных действительно стал криво рисовать. А вот в qreal - наоборот получше вроде. Чем не подходит преобразовывать в qreal и рисовать?

Вроде нормально рисуется:

#include <QApplication>
#include <QLabel>
#include <QCheckBox>
#include <QPainter>
#include <QMouseEvent>
#include <QLayout>

class DrawLine: public QWidget {
Q_OBJECT
public:
    DrawLine() : size(11), scale(60), radius(5), active(-1), hover(-1),
                 image(size, size, QImage::Format_RGB32), round(false) {
        int sz = size*scale;
        setMinimumSize(sz, sz);
        int half = sz/2;
        pts[0] = QPoint(half/2, half);
        pts[1] = QPoint(half*3/2, half);
        renderLine();
        setMouseTracking(true);
    }
    void emitCoords() {
        QString str;
        if (round) {
            QPoint p0 = roundCoords(0);
            QPoint p1 = roundCoords(1);
            str.sprintf("P0: (%d, %d) P1: (%d, %d)", p0.x(), p0.y(), p1.x(), p1.y());
        } else {
            QPointF p0 = coords(0);
            QPointF p1 = coords(1);
            str.sprintf("P0: (%.2f, %.2f) P1: (%.2f, %.2f)", p0.x(), p0.y(), p1.x(), p1.y());
        }
        emit coordsUpdated(str);
    }
public slots:
    void setRound(bool round) {
        this->round = round;
        renderLine();
    }
signals:
    void coordsUpdated(QString coords);
protected:
    virtual void paintEvent(QPaintEvent*) {
        QPainter p(this);
        for (int i = 0; i < size; ++i) {
            for (int j = 0; j < size; ++j) {
                QRgb cur = image.pixel(i, j);
                p.fillRect(i*scale, j*scale, scale, scale, QColor(cur));
            }
        }
        p.setPen(Qt::lightGray);
        int sz = size*scale;
        for (int i = 0; i < size; ++i) {
            int x = i*scale;
            p.drawLine(x, 0, x, sz);
            p.drawLine(0, x, sz, x);
        }
        p.setRenderHint(QPainter::Antialiasing);
        p.setPen(Qt::blue);
        p.drawLine(pts[0], pts[1]);
        p.setPen(Qt::NoPen);
        for (int i = 0; i < 2; ++i) {
            p.setBrush(i == hover ? Qt::yellow : Qt::blue);
            p.drawEllipse(pts[i], radius, radius);
        }
    }
    virtual void mousePressEvent(QMouseEvent *event) {
        if (active == -1 && event->button() == Qt::LeftButton) {
            int current = index(event->pos());
            if (current != -1)
                active = current;
        }
    }
    virtual void mouseReleaseEvent(QMouseEvent *event) {
        if (active != -1 && event->button() == Qt::LeftButton) {
            active = -1;
        }
    }
    virtual void mouseMoveEvent(QMouseEvent *event) {
        if (active != -1) {
            pts[active] = event->pos();
            renderLine();
        }
        int current = index(event->pos());
        if (current != hover) {
            hover = current;
            update();
        }
    }
private:
    QPointF coords(int idx) {
        return QPointF(pts[idx])/scale;
    }
    QPoint roundCoords(int idx) {
        return (coords(idx) - QPointF(0.5, 0.5)).toPoint();
    }
    int index(QPoint p) {
        for (int i = 0; i < 2; ++i) {
            if (QLineF(p, pts[i]).length() <= radius)
                return i;
        }
        return -1;
    }
    void renderLine() {
        image.fill(qRgb(255, 255, 255));
        QPainter p(&image);
        p.setPen(Qt::red);
        if (round) {
            p.drawLine(roundCoords(0), roundCoords(1));
        } else {
            p.drawLine(coords(0), coords(1));
        }
        emitCoords();
        update();
    }
    int size;
    int scale;
    int radius;
    int active;
    int hover;
    QImage image;
    QPoint pts[2];
    bool round;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget widget;
    QLabel label;
    QCheckBox round("Round coords");
    DrawLine draw;
    QObject::connect(&draw, SIGNAL(coordsUpdated(QString)), &label, SLOT(setText(QString)));
    QObject::connect(&round, SIGNAL(toggled(bool)), &draw, SLOT(setRound(bool)));
    QGridLayout layout;
    layout.addWidget(&round, 0, 0);
    layout.addWidget(&label, 0, 1);
    layout.addWidget(&draw, 1, 0, 1, 2);
    layout.setColumnStretch(1, 1);
    widget.setLayout(&layout);
    widget.show();
    draw.emitCoords();
    return app.exec();
}

#include "main.moc"

kamre ★★★
()
Последнее исправление: kamre (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.