qt - mapFromGlobal

0

Chodzi o to że wywołanie cursor.setPosition() nie przenosi mnie do rogu okna opengl-a., a zamiast tego przenosi myszkę na lewygórny róg ekranu laptopa.
Chciałem aby ruch myszką przeniósł kursor na początek, ale okna opengl-a.
Próbowałem też funkcji mapFromGlobal ale nie działa. Dzieje się to samo.

a czy wywoałnie showFullScreen(); nie powinno zrobić fullscrena? wywołanieqtOkno.showFullScreen(); z poziomu pliku main.cpp
robi full screen, ale nie mam pojecia jak dodać do tego jakiś event przycisku,, raczej będzie bardzo ciężko.

klsasa okna opengl-a

class OknoGL : public QGLWidget....

void OknoGL::mouseMoveEvent(QMouseEvent* e)
{
    QCursor c = cursor();
    c.setPos(mapFromGlobal(QPoint(0, 0)));
    //setCursor(c);
    //camera.mouseUpdate(glm::vec2(e->x(), e->y()));
    repaint();
}

void OknoGL::keyPressEvent(QKeyEvent* e)
{
    switch (e->key())
    {
        case Qt::Key::Key_W:
            camera.moveForward();
            break;
        case Qt::Key::Key_F:
            this->showFullScreen();
            break;
    }
    repaint();
}

main :

#include <OknoGL.h>
#include <QtWidgets\qapplication.h>
#include <QTwidgets.h>

int main(int argc, char* argv[]){

    QApplication app(argc, argv);
    QTwidgets qtOkno;

    QSurfaceFormat format;
    format.setVersion(2, 1);
    qtOkno.setWindowTitle("Wizualizacja wektorow 3d");
    qtOkno.resize(500, 500);
    //qtOkno.showFullScreen();
    qtOkno.show();

    return app.exec();
}
0

Co chcesz zmapować na co? Zrób najlepiej screenszota widgetów z zaznaczeniem, który to parent a który to child.
Ale ja obstawiam takie coś (sam w swoim projekcie niedawno zrobiłem :])

 QPoint p = yourGLWindow->mapToGlobal(QPoint(0, 0));
 mysza->setPos(mapFromGlobal(p));

Jak chcesz Bracie okno zmaksymalizowane to używasz QWidget::showMaximized();

EDIT:
Hmmm, robisz taki numer w mouseMoveEvent...to tak:
1) jeśli nie masz wciśniętego przycisku myszy to ta funkcja się nie woła o ile nie masz włączonego mouseTracking (czy jakoś tak) - a domyślnie jest wyłączony
2) może dojść do zapętlenia się wywołania - co drygniesz myszą to kursor będzie lądował w lewym, górnym rogu. Na pewno o taki efekt chodzi?

0

niestety nie mam dostępu z poziomu klasy opengl do widgetu opengl..
Chodzi o to że po najechaniu na okno openglea myszka prznoisiła mnie na początek tego okna.

to jest efekt przejściowy, a chodzi o to żeby po dojechaniu do krawędzi okna, kursor wskakiwał na środek ekranu...

Czyli nie mogę wykonać showFullScreen / showMaximazed bo moja klasa OknoGL nie publiczy z Qtwidget?

0

Możesz, bo dziedziczysz pośrednio: OknoGL -> QGLWidget -> QWidget.

Co do skakania kursorem w określone miejsce ekranu, to właśnie do tego są funkcje mapTo/From Global/Parent itd. A dostęp masz, zamiast tego yourGLWindow użyj po prostu this

0

No ale ....
no to nie działa.

  case Qt::Key::Key_F:
            this->showFullScreen();
            break;

to jak przenieść myszkę na środek ekranu? bo mnie ciągle przenosi na początek monitora.
Co trzeba wywowałać?



c.setPos(mapFrom(this, QPoint(0, 0))); 
```powoduje przejśćie myszki na róg monitora
0

Jakie showFullScreen() do Swaroga żesz Najjaśniejszego?! Dyć piszę showMaximized()

 QPoint p = this->mapToGlobal(QPoint(0, 0));//to przy założeniu, że wywołujesz gdzieś w metodach OknoGL
 c.setPos(p);

Tak też nie bangla? To się zdziwię...

Natomiast jak wyliczyć środek ekranu - potrzebujesz Bracie QDesktopWidget::screenGeometry(QWidget *) aby pobrać parametry ekranu na którym masz wyświetlonego widgeta OknoGL. Dalej robisz QPoint middlePoint(rectFromScreenGeometry.width()/2, rectFromScreenGeometry.height()/2), i na tym robisz cursor.setPos(middlePoint)

0
MasterBLB napisał(a):

Jakie showFullScreen() do Swaroga żesz Najjaśniejszego?! Dyć piszę showMaximized()

 QPoint p = this->mapToGlobal(QPoint(0, 0));//to przy założeniu, że wywołujesz gdzieś w metodach OknoGL
 c.setPos(p);

Tak też nie bangla? To się zdziwię...

Natomiast jak wyliczyć środek ekranu - potrzebujesz Bracie QDesktopWidget::screenGeometry(QWidget *) aby pobrać parametry ekranu na którym masz wyświetlonego widgeta OknoGL. Dalej robisz QPoint middlePoint(rectFromScreenGeometry.width()/2, rectFromScreenGeometry.height()/2), i na tym robisz cursor.setPos(middlePoint)

a co ty chcesz od showFullScreen 0_o
co to jest middlePoint? nie mogę tego znależć..
rectFromScreenGeometry? yyyy nie wiem o co chodzi.
EDIT
Chyba wiem o co cho...
postaram się zrobić.

0

Hmm, nie wiem, jak ty Bracie to dajesz radę zmaścić, ale problem okazuje się być banalny. Stworzyłem testowo prościutki widget z przeimplementowaną metodą mouseReleaseEvent:

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    QPoint middlePoint(width()/2, height()/2);
    QCursor::setPos(mapToGlobal(middlePoint));

    QWidget::mouseReleaseEvent(event);
}

i bangla jak ta lala, kursor pozycjonuje się na środku Wigeta nie ważne, czy go umieszczę na 1, czy na 2 monitorze.

EDIT:
Żeby nie było, masz tutaj dodatkowo unitTest:

void Widget::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);

    QPainter painter(this);
    painter.setPen(QPen(Qt::red, 2));

    painter.drawLine(0, height()/2, width(), height()/2);
    painter.drawLine(width()/2, 0, width()/2, height());
}
0

Ma pan brat rację.. to naprawdę działa..zmieniłem troszkę i mam kamerę 360stopni.

void OknoGL::mouseMoveEvent(QMouseEvent* e)
{
    glm::vec2 position = glm::vec2(e->x(), e->y());
    if (position.x > width()-10 || position.x < 10.f)
    {
        QPoint middlePoint(width() / 2, height() / 2);
        QCursor::setPos(mapToGlobal(middlePoint));
    }
    camera.mouseUpdate(glm::vec2(e->x(), e->y()));
    repaint();
}

Dlaczego tutaj jest ustawione mapToGlobal to nie mam pojecia, ale działa. Bo z tego co tam pisze to ma ta funkcja zamieniać na współrzędne globalne...
Natomiast pan mówi że w klasie OknoGL, która dziedziczy z QGlwidgetwywoałnie w metodzie keyPressEvent(QKeyEvent* e)
metody this->showMaximized(); powinno dać duży ekran? bo u mnie się tak nie dzieje. Zdarzenie działa poprawnie, ale nic się nie powiększa.

0

Nie, poprawka, moje całe okno jest w pliku source.cpp, gdzie jest funkcja main. //qtOkno.showFullScreen(); działa poprawnie, tylko że, jak mogę się do tego odwowołać poza tym plikiem, klasy nie stworze, bo instukcja QApplication app(argc, argv); musi być stworzona przed QTwidgets qtOkno; bo wyskakuje że nie można stowrzyć widgetu przed stworzniem aplikacji.. a aplikacja musi pobierac argc, i argv z tego co widzę.
wow.

#include <QtWidgets\qapplication.h>
#include <QTwidgets.h>
#include <OknoGL.h>

int main(int argc, char* argv[]){

    QApplication app(argc, argv);
    QTwidgets qtOkno;

    QSurfaceFormat format;
    format.setVersion(2, 1);
    qtOkno.setWindowTitle("Wizualizacja wektorow 3d");
    qtOkno.resize(500, 500);
    //qtOkno.showFullScreen();
    qtOkno.show();
    return app.exec();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0