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łanie qtOkno.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 QGlwidget wywoał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();
}


0
bartek164 napisał(a):

Dlaczego tutaj jest ustawione mapToGlobal to nie mam pojecia, ale działa.

Dlatego, że QCursor::setPos() oczekuje współrzędnych globalnych, a te dostaje z qtOkno.mapToGlobal(middlePoint);

bartek164 napisał(a):
qtOkno.show();

To zamień Bracie na qtOkno.showMaximized();

0

no ja wiem, że trzeba zamienić qtOkno.showFullScreen();, ale jak to zrobić z poziomu eventu, to nie wiem, bo nie mam dostępu do qtOkno, poza funkcją main w pliku source.cpp.

2

Eventu jakiego typu i przekazanego do jakiej klasy?

0

próowałem stworzyć plikn nagłówkoy
#pragma once

#include <QTwidgets.h>

QTwidgets* qtWindowPointer;

source.cpp

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

	QApplication app(argc, argv);
	QTwidgets qtOkno;

	qtWindowPointer = &qtOkno;

ale dostaje kom..:
Error 2 error LNK2005: "class QTwidgets * qtWindowPointer" (?qtWindowPointer@@3PEAVQTwidgets@@EA) already defined in OknoGL.obj D:\C++Projects\Wektory3D\Source.obj Wektory3D

aby póżniej w pliku qtWidgets,cpp dodać #include <windowPointer.h>
i w nim wykonać
case Qt:
qtWindowPointer->showFullScreen();
break;

2

O Swarogu, Perunie, Trygławie, Welesie i cały panteonie, ale Bracie maścisz i kombinujesz... Od początku tłukę Ci do dyni aby użyć showMaximized(), to nie.
Oto zmodyfikowany przykład Widgeta z poprzedniej strony, teraz po kliknięciu i puszczeniu przycisku myszy maksymalizuje się, a jeśli był zmaksymalizowany to wraca do domyślnego rozmiaru:

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    QWidget::mouseReleaseEvent(event);
    if (windowState() & Qt::WindowMaximized)
    {
        showNormal();
    }
    else
    {
        showMaximized();
    }
}
0

aaaaa, to nie mówiłeś że ja to muszę zrobić w klasie QTwidgets.
Dodałem tą funkcjonalność do przycisku...
Dziękuję za pomoc... bardzo...
Jeszcze tylko jedna rzecz i będzie gotowe projekdzidło.

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