Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Anatoliy от Апрель 09, 2007, 20:15



Название: Тонкости использования ArthurFrame. Что-же не так?
Отправлено: Anatoliy от Апрель 09, 2007, 20:15
Всем привет!

Недавно начал использовать ArthurFrame! Классная вещь- качественная прорисовка без мерцаний и несильно нагружает проц.

Но руки оказались недостаточно прямыми :oops:

1.

Код:


class Renderer : public ArthurFrame {

    QBasicTimer timer;
    void paint(QPainter* painter){/* ...something... */}
    void timerEvent(QTimerEvent* e){repaint();}
    // something else...
};

class MyWidget : public QWidget {

     Renderer* myRenderer;

// something else...

};
// остальное непринципиально



Это в точности такое использование, как в примерах Qt. Естесвенно, все получается нормально.

Но попробовав организовать чуть-чуть по другому:

2.

Код:


class Renderer : public ArthurFrame {

    void paint(QPainter* painter){/* ...something...*/}
    // something else...
};

class MyWidget : public QWidget {

     Renderer* myRenderer;

public:

     void paintQuickly(){myRenderer->repaint();}

// something else....
};

class MyThread : public QThread {

    MyWidget* widget;

    void run(){

        while(true){

              widget->repaintQuickly();
              msleep(100);
        }
    }
};



И вот во втором случае все очень плохо, фрейм перерисовывается с сильными подергиваниями, причем дергается весь фрейм(окно верхнего уровня) вместе с заголовком, хотя ему вроде бы и не приказывали перерисовываться. Да и чем отличается второй вариант от первого? Не вижу разницы... :cry:  :cry:  :cry:

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


Название: Тонкости использования ArthurFrame. Что-же не так?
Отправлено: goer от Апрель 09, 2007, 20:27
Assistant:
Цитировать

Note that QCoreApplication::exec() must always be called from the main thread (the thread that executes main()), not from a QThread. In GUI applications, the main thread is also called the GUI thread because it's the only thread that is allowed to perform GUI-related operations.


Если MyWidget создан(или живет) в не гуевом потоке то никто не дает гарнтий что виджет будет отображаться вообще. Все гуевые классы должны создаваться и жить только в гуевом потоке!