Как да покажа приложение Qt (джаджи) на QNX въз основа на конкретно местоположение и размер?

Опитвам се да накарам приложението си, базирано на Qt widgets, да работи на QNX устройство на конкретно местоположение и размер, използвайки QWidget::setGeometry(..), но то винаги се показва на цял екран.

Приложението използва QMainWindow с лента с менюта и QGLWidget като централна джаджа.

Същият код, работещ на работния плот на Linux, работи добре, позициониран въз основа на предоставените x & y и с предоставения размер.

Прозоречната система на QNX не поддържа ли това? Или Qt не може да използва прозоречната система на QNX? Или нещо друго? не го разбирам :(

Всяка помощ е много ценена!


person Surya Wijaya Madjid    schedule 11.10.2015    source източник


Отговори (1)


Приставката за платформата Qt е внедрена с оглед на възможностите и ограниченията на платформата. Изглежда, че QNX поддържа само превключване на прозорци, без пълноценно управление на прозорци, както бихте имали в windows или linux, следователно Qt приложенията са имплицитно и вероятно присъщо цял екран.

Ако желаете да не е на целия екран, просто внедрете празен основен прозорец и позиционирайте централния уиджет, като го оставите свободно плаващ, вместо да бъде поставен в оформление в главния прозорец.

Но това не означава, че ще можете да поставите повече приложения на екрана, а само няма да използвате целия екран за прозореца на едно приложение, което показва. Бихте могли да фалшифицирате множество приложения, като просто използвате множество джаджи и внедрите свой собствен фалшив мениджър на прозорци, предупреждението е, че все още ще използвате един процес, което може или не може да се окаже проблем.

Ето какво имам предвид под „свободно плаваща джаджа“:

class YourWidget : public QWidget {
    Q_OBJECT
public:
    YourWidget(QWidget * p) : QWidget(p) { resize(100, 100); }
    void paintEvent(QPaintEvent *) {
        QPainter p(this);
        p.fillRect(rect(), Qt::black);
    }
};

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0) : QMainWindow(parent) {
        resize(500, 500);
        QWidget * blank = new QWidget;
        setCentralWidget(blank);
        widget = new YourWidget(blank);
        widget->move(rect().center());
    }

    void mousePressEvent(QMouseEvent * e) {
        widget->move(e->pos());
    }
private:
    YourWidget * widget;
};

YourWidget вече не е закотвен от оформление, той е свободен да се премества в произволна позиция, той все още е нарисуван в границите на неговия уиджет контейнер, който е просто празен уиджет, зададен като централен уиджет на прозореца и животът също се управлява автоматично.

person dtech    schedule 11.10.2015
comment
Здравей ddriver, благодаря за отговора. Какво точно имате предвид под това да го оставите свободно плаващ? В този момент задавам QGLWidget като централен уиджет с помощта на QMainWindow::setCentralWidget(..). - person Surya Wijaya Madjid; 12.10.2015
comment
Благодаря за новата подсказка. Опитах, както предложихте, с разликата, че YourWidget е друг QMainWindow, който съдържа както лентата с менюта, така и QGLWidget (като централен). За съжаление YourWidget все още заема целия екран по някакъв начин :( - person Surya Wijaya Madjid; 12.10.2015
comment
Не трябва да имате главен прозорец в главния прозорец, има само един основен прозорец. Не използвайте главен прозорец, ако искате да контролирате размера и позицията на QNX. - person dtech; 12.10.2015
comment
Разбирам... наистина, ако имам само един основен прозорец и предполагаемата централна джаджа не е зададена като централна, а само плаваща, тогава мога да контролирам размера и позицията. Но как тогава да позиционирам цял основен прозорец, включително неговата лента с менюта? Възможно ли е всъщност? - person Surya Wijaya Madjid; 13.10.2015
comment
Изпълнението на главния прозорец изглежда е свързано с изпълнението на плъгина на платформата - не можете да го използвате. Можете обаче да внедрите приспособление с меню, като цяло приложите персонализирано приспособление с функционалността от QMainWIndow, от която се нуждаете. Може да е жизнеспособна опция за внедряване на QMainWindow производен клас, който не е обвързан с приставката на платформата, ако замяната на това поведение наистина е включена в дизайна. Прегледайте изпълнението на QMainWindow, за да определите дали това е възможно. - person dtech; 13.10.2015
comment
Това е гадно. Добре, ще помисля. Друга опция, която знам, че ще работи, е да се използват QGraphicsView и QGraphicsScene, за да се начертае GL като фон и UI контролите да се добавят към сцената. След това позиционирането може да се извърши чрез задаване на позицията на уиджетите чрез неговите прокси уиджети. Както и да е, благодаря ви много за помощта! - person Surya Wijaya Madjid; 13.10.2015
comment
Бих препоръчал вместо това да изберете QML - той има по-добра графична производителност и е МНОГО по-лесен и бърз за внедряване на потребителски интерфейс с него. - person dtech; 13.10.2015