MoveEvents Problem

Verschiedenes zu Qt
Antworten
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

MoveEvents Problem

Beitrag von toem »

Hallo,

ich möchte ein Widget während des Verschiebens leicht durchsichtig machen. Wie das via setWindowOpacity geht weiss ich.
Aber welche Events nutze ich dafür am besten? MoveEvent wir ja erst ausgelöst, wenn der Move beendet ist. Aber welcher Event startet den Move?

Ich wäre für einen kurzen Tip dankbar.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Der move dauert doch eh länger, oder? Dann sollte es egal sein, wenn beim ersten moveEvent das Fenster noch nicht durchscheinend ist, oder?

Ansonsten kannst du natürlich deine eigene Window-Deko schreiben. Schau dir dazu mal z.B. qmmp an. Keine System-Deko sondern ne eigene. Darin kannst du dann nen mousePressEvent() abfangen und die opacity ändern, am besten dynamisch faden :)

Oder du versuchst dich in den WindowManager einzuklinken, hab da aber absolut keine Ahnung, und es wird auch ganz schön umfangreich, wenn dein App auf Windows, Mac und Linux (allein letzteres hat ja zig Manager...) laufen soll.
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

qmmp bringt mich da nicht weiter. Ich habe nicht die Zeit mich durch ein ganzes Projekt zu arbeiten um dort den Move zu suchen.
Desweiteren wird das MoveEvent einmalig und nur am Ende des Movings ausgeführt (When the widget receives this event, it is already at the new position.)
Bringt also alles nichts
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

toem hat geschrieben:Desweiteren wird das MoveEvent einmalig und nur am Ende des Movings ausgeführt (When the widget receives this event, it is already at the new position.)
Bringt also alles nichts
Probiers doch wenigstens aus, wäre nämlich die leichteste Variante!

Code: Alles auswählen

#include <QWidget>
#include <QMoveEvent>
#include <QDebug>

class Window : public QWidget
{
    Q_OBJECT
    protected:
        void moveEvent(QMoveEvent *e)
        {
            qDebug() << e->oldPos() << e->pos();
        }
};
Ausgabe bei schnellem Verschieben:

Code: Alles auswählen

QPoint(0,0) QPoint(0,0)            
QPoint(0,0) QPoint(36,43)          
QPoint(36,43) QPoint(46,43)        
QPoint(46,43) QPoint(49,43)        
QPoint(49,43) QPoint(50,43)        
QPoint(50,43) QPoint(54,43)        
QPoint(54,43) QPoint(60,43)        
QPoint(60,43) QPoint(61,43)        
QPoint(61,43) QPoint(64,43)        
QPoint(64,43) QPoint(66,43)        
QPoint(66,43) QPoint(69,43)        
QPoint(69,43) QPoint(72,43)        
QPoint(72,43) QPoint(73,43)        
QPoint(73,43) QPoint(74,43)        
QPoint(74,43) QPoint(76,43)        
QPoint(76,43) QPoint(76,54)        
QPoint(76,54) QPoint(76,56)        
QPoint(76,56) QPoint(76,59)        
QPoint(76,59) QPoint(76,61)        
QPoint(76,61) QPoint(76,63)
Es ist also nicht so, dass das moveEvent erst aufgerufen wird, wenn du am Ende deiner Bewegung bist. Alle 10px 2-3 Events sollte doch reichen, oder?

Aber funktionieren wird es nicht, denn dich interessiert schon der erste Klick in die Window-Deko. Denn der Weg über das moveEvent geht nur mit einem Timer, der nach bestimmter Zeit, wenn nicht bewegt wurde, die Transparenz wieder rückgängig macht.

Und ich hab jetzt mal 1 Minute durch qmmp geschaut. Dich interessieren wohl in qmmp/src/ui die MainWindow und TitleBar.

Und die Zeit sollstest du dir schon nehmen, die Konsequenzen deiner Entscheidungen zu überdenken, und eine Lösung zu suchen die auch funktioniert, auch wenn du dafür mal ein bisschen in anderen Projekten schnüffeln musst...
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

Was ich daran interessant finde ist, dass bei mir mit Deinem Code immer nur NACH dem Verschieben eine Debug-Ausgabe erfolgt. Während des Verschiebens passiert da rein gar nichts.

Ich habe Qt 4.5.2
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Heißt das du kriegst den ganzen Output erst wenn du fertig bewegt hast?
Um auszuschließen, dass es ein Problem mit deiner Console ist, versuch mal das:

Code: Alles auswählen

#include <QListWidget>
#include <QMoveEvent>

class Window : public QListWidget
{
    Q_OBJECT
    protected:
        void moveEvent(QMoveEvent *e)
        {
            QString label = "("+
                QString::number(e->oldPos().x()) + ", " +
                QString::number(e->oldPos().y()) + ") -> (" +
                QString::number(e->pos().x()) + ", " +
                QString::number(e->pos().y()) + ")";
            addItem(label);
        }
};
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

Wie gesagt, bei mir erfogt die Ausgabe NACH dem Move. Und dann auch nur eine Ausgabe.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Dann sag auch mal welches OS/Compiler du verwendest.
Und wenn es nicht geht, ist es für dich eh keine Lösung. Dann musst du dich mit einer eigenen Deko auseinandersetzen, wenn die Transparenz beim Verschieben ein kritisches Feature ist ;) Dazu mainwindow und titlebar von qmmp.
http://qmmp.ylsoftware.com/index_en.php
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag von toem »

Ich nutze mingw
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Hast Du deinem Windows auch gesagt 'Fenster beim verschieben anzeigen'?
Antworten