c ++ - Enhver måde at videresende trække/slippe hændelser til indlejret procesvindue?

Indlæg af Hanne Mølgaard Plasc

Problem



En lille smule baggrund:


Jeg skal indlejre et webview af en slags i en Qt-applikation (der indgår python/PyQt) for at vise noget html-indhold. Jeg sidder fast med MinGW-bygningen af ​​Qt, fordi det er hvad Windows-versionen af ​​vores software er bygget med, og det er ikke muligt at overføre til Visual C ++. Desværre for mig er QtWebKit fjernet fra nyere versioner af Qt og dens udskiftning, QtWebEngine, understøttes ikke af MinGW-bygningerne af Qt.


Det ser ud til, at mine resterende muligheder er en af



  • Vedligeholde en brugerdefineret bygning af Qt, der genindholder den gamle QtWebKit-kode.

  • Embed en anden renderingsmotor.

  • Start en webbrowser i en separat proces og indlejrer sit vindue i hovedprogrammet.






Jeg har kigget på de to første muligheder, og begge lyder som en smule af en PITA med en kombination af forældet/forladt kode og komplicerede byggeprocesser med patchy/outdated/conflicting dokumentation og begrænset Windows support.


Jeg har besluttet at undersøge muligheden for at indlejre en webbrowserproces i min ansøgning. Jeg har haft succes med at få en firefox-proces indlejret i PyQt ved hjælp af QWindow::fromWinId og QWidget::createWindowContainer


self.process = QtCore.QProcess()
self.process.setProgram('C:/Program Files (x86)/Mozilla Firefox/firefox.exe')
self.process.start()

time.sleep(1)
hwnd = get\_window\_handle(self.process.processId())

ext\_win = QtGui.QWindow.fromWinId(hwnd)
widget = QtWidgets.QWidget.createWindowContainer(ext\_win)
widget.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.ForeignWindow)
self.layout().addWidget(widget)


Jeg kan trække og slippe html-filer i det indbyggede firefox-vindue, og de indlæses fint. Jeg troede, at jeg muligvis kunne udnytte denne funktion ved at fejre træk/sliphændelser for at programmere at indlæse filer.


def fakeDragDropEvent(self, urls):
    point = QtCore.QPoint(self.width()/2, self.height()/2)

    self.mimedata = QtCore.QMimeData()
    self.mimedata.setUrls(urls)

    dragevent = QtGui.QDragEnterEvent(point, QtCore.Qt.CopyAction, self.mimedata, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)
    app.postEvent(self, dragevent)

    time.sleep(0.1)

    dropevent = QtGui.QDragEnterEvent(point, QtCore.Qt.CopyAction, self.mimedata, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)
    app.postEvent(self, dropevent)


Disse falske begivenheder kan afhentes af hovedvinduet osv., Når jeg implementerer hændelseshåndteringsprogrammer og indstiller acceptDrops(True), men de synes ikke at have nogen effekt på det indlejrede procesvindue.


Er der nogen måde at få mit indlejrede procesvindue til at hente disse begivenheder? Eller skal jeg muligvis programmere drag/drop-begivenhederne ved hjælp af det native Windows API i stedet?


Jeg er også åben for andre forslag til, hvordan jeg kan vise html i min ansøgning.

Bedste reference