QAxWidget und Events

Alles rund um die Programmierung mit Qt
Antworten
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

QAxWidget und Events

Beitrag von Sephral »

Hallo zusammen,

ich habe ein kleines Problemchen mit QAxWidget und Maus-Events.

Das Problem:
Ich möchte in meine Anwendung ein ActiveX-Control einfügen, welches lediglich zur Anzeige von VideoStreams dienen soll. Das ActiveX-Control bietet sehr viele Optionen, die ich dem Benutzer aber nicht zur Verfügung stellen möchte, außerdem brauche ich weiterhin in meinem Teil der Anwendung volle Kontrolle über Maus- und Drag/Drop-Events, die auf der Zeichnungsebene des Controls geschehen, um z.B. einen anderen Videostream per Dran&Drop anzuzeigen. Als Drag&Drop-Source dient ein Kamerabaum in meiner Anwendung.

Bisher hatte ich immer nur Video-APIs verwendet, die mir die Kontrolle über alle Events gelassen haben (diese haben einfach auf einem Window-Handle gezeichnet das ich der API übergeben habe). Nun muss ich (leider) auf ein ActiveX-Control zurückgreifen, um einen gewissen Kameratyp einzubinden. Dieses Control "verschluckt" leider alle Events.


Lösungsansatz:
Ich habe versucht den Eventhandler des ActiveX-Controls auszutauschen gegen meinen eigenen, leider war ich dabei nicht sonderlich erfolgreich. Eventuell hat jemand hier im Forum eine Idee, was ich falsch gemacht habe.

Ich habe QAxWidget abgeleitet (MyQAxWidget) und dort die winEvent-Funktion eingefügt, das selbe in der Klasse, die diesen Code ausführt. Diese protokolliert im Moment lediglich welche Events ankommen. Die üblichen Verdächtigen wie mouseEvent(...) und mouseDoubleClickEvent(...) erzeugen ebenfalls Debugausgaben.

Der Code sieht im Moment so aus. Zum Test habe ich einfach das ActiveX-COntrol von Acrobar

Code: Alles auswählen

// QAxWidget erzeugen und auf GUI setzen
this->ax = new MyQAxWidget(this->ui.centralWidget);
this->ax->setGeometry(10,10,200,200);

// Control laden und ein PDF darstellen
this->ax->setControl("{CA8A9780-280D-11CF-A24D-444553540000}");
QVariantList params;
params.append(QDir::currentPath() + "/test.pdf");
bool result = this->ax->dynamicCall("LoadFile(QString)", params).toBool();
this->ax->show();

// Ersetzen des Eventhandlers und Umleiten der Events auf eigene Routine
IOleWindow* oleWnd = NULL;
QUuid id = IID_IOleWindow;
this->ax->queryInterface(id,(void **)&oleWnd);
HWND hwndParent;
oleWnd->GetWindow(&hwndParent);
LONG_PTR proc = GetWindowLongPtr(this->winId(),GWLP_WNDPROC);
LONG_PTR procold = SetWindowLongPtr(hwndParent,GWLP_WNDPROC,proc);
Beim Austauschen des Eventhandlers mache ich zur Zeit noch irgendetwas falsch. Eventuell kann mir jemand einen bei diesem Problem weiter helfen. Am liebsten wäre es mir ja, wenn direkt die Qt-Event-Funktionen angesprochen werden würden.

Danke,
Sephral
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: QAxWidget und Events

Beitrag von macman »

Sephral hat geschrieben:Dieses Control "verschluckt" leider alle Events.
Das hiesse ja das dein Programm unbrauchbar wird, sobald das Control eingebunden ist. Kann ich mir nicht vorstellen. höchstens das gewisse Events an das Control gehen, sobald es den Focus hat, und die werden eben nicht abgearbeitet.

Schon mal mit setFocusProxy probiert?
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Re: QAxWidget und Events

Beitrag von Sephral »

macman hat geschrieben:
Sephral hat geschrieben:Dieses Control "verschluckt" leider alle Events.
Das hiesse ja das dein Programm unbrauchbar wird, sobald das Control eingebunden ist.
Das Control zeigt nach Rechtsklick usw eigene Kontextmenüs an, diese brauche ich aber nicht, da ich alle Funktionen, die ich benötige, auch über dynamicCalls verwenden kann. Stattdessen sollen meine eigenen Menüs angezeigt werden, die dann z.B. Funktionen wie "Stream beenden" aufweisen.
macman hat geschrieben:
Sephral hat geschrieben:Dieses Control "verschluckt" leider alle Events.
Schon mal mit setFocusProxy probiert?
Ich habe es gerade mal versucht. Der FocusProxy scheint nur zu funktionieren, so lange das Control noch nicht aktiv ist.

Danke für Deine schnelle Antwort :-)
Antworten