Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.05.2013, 15:17

[Qt 4.8.1] Pixmap an QCursor anhängen

Hallo, ich habe ein kleines Problem, bei dem ich einen Denkanstoß benötige.
Und zwar geht es hierbei darum, das ich eine QPixmap (Größe sehr variabel) unter den Mauszeiger packen möchte. Dem Mauszeiger das Aussehen eines QPixmaps zu geben ist hierbei nicht das Problem, nur leider verschwindet dann auch der Mauszeiger (Pfeil oder ähnliches) komplett.
Sinn der Sache ist es, das ich aus einer Liste ein Bild auswähle, und dieses dann per Klick, auf ein QGraphicsView, platzieren kann. Allerdings möchte ich auch mit selektierten Eintrag bereits platzierte Items in der View auswählen können, deswegen ist es wichtig, das der Mauszeiger nicht verschwindet.
QDrag macht eigentlich genau das, was ich mir wünsche, nur weiß ich nicht, wie ich mir das für meine Wünsche anpasse. QDrag wird jedenfalls beendet, wenn kein Drag statt findet. Ein solcher findet bekanntlich nicht statt, wenn man die linke Maustaste los lässt ;)
Optimaler Weise soll die Pixmap nur über meiner View angezeigt werden.
Ich hatte bereits überlegt, von QCursor zu erben, und diesen dann einfach zu übergeben, allerdings ist das wohl lediglich ein Informationsspeicher, und zeichnet sich nicht selbst, weswegen diese Möglichkeit schonmal flach fällt.
Hat hier jemand eine Idee, oder sowas ähnliches schon gemacht?

mfg

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

2

22.05.2013, 00:25

Nun ja, eine besonders clevere Lösung ist es auch nicht, aber du könntest bspw. einfach ein eigenes, parentloses Widget erstellen, das keinen Rand hat und immer Im Vordergrund ist, und im paintEvent das Bild zeichnet:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
MyWidget::MyWidget() 
    : QWidget(nullptr, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint)
{
    this->resize(100, 100);
}

void MyWidget::paintEvent(QPaintEvent* ev) {
    QPainter painter(this);
    // Malen....
}


In der Hauptanwendung fragst du bspw. über einen Timer die Position der Maus ab und setzt dann immer die Position des Widgets entsprechend (ein bisschen versetzt damit es nicht so sehr MouseEvent abfängt)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
//  Irgendwo:
//  QTimer* timer = new QTimer(this);
//  connect(timer, SIGNAL(timeout()), this, SLOT(onTimer()));
//  timer->start(20);
//  MyWidget* w = new MyWidget;
//  w->show();

void MainWindow:onTimer() {
    QPoint pos = QCursor::pos();
    w->move(pos.x() + 5, pos.y() + 5);
}


Mit show()/close() kannst du das Widget immer dann anzeigen lassen wenn du es brauchst. Also velleicht noch prüfen bei onTimer() ob sich die Maus über einem passenden Widget befindet.
Vermutlich keine besonders saubere Lösung, aber relativ schnell gemacht und vielleicht reicht es ja für dich ; )

3

22.05.2013, 07:52

Wäre natürlich eine Möglichkeit. Dabei könnte ich das auch die View zum Parent machen, und eben MouseMoveEvent überladen. An sich sicher eine Möglichkeit, aber wäre mir lieber, wenn ich das auf ähnliche Art und Weise lösen könnte, die QDrag nutzt.

Werbeanzeige