2017-11-16 3 views
0

Ich verwende ein QWebEngineView und setze es HTML. Wenn ich es zeige, ist der HTML-Code immer kleiner als der Gesamtbereich, den ich dem QWebEngineView gegeben habe. Wenn Sie mit der rechten Maustaste auf die Seite klicken und dann auf "Neu laden" klicken, wird das Problem immer behoben. Ich möchte jedoch nicht, dass Endbenutzer jedes Mal auf "Neu laden" klicken. Ich habe bereits online nach einem Weg gesucht, um neu zu laden, und gefunden:PyQt5 QWebview Aktualisieren Problem

my_qwebengineview.page().action(QWebEnginePage.Reload).trigger() 

Dies ist nicht die gleiche Art und Weise ein Rechtsklick funktioniert Ändern der Größe, though.

Wenn es beim Lesen des Codes hilft, wird ein Plotly-Plot als HTML-Seite angezeigt (lange Geschichte).

Ich schaffe das Widget sitzt er unten mit dem Code auf:

grid_layout = QGridLayout() 
logo = QLabel() 
logo_pixmap = QPixmap('logo.jpg') 
logo.setPixmap(logo_pixmap) 
grid_layout.addWidget(logo, 0, 0, 2, 6) 
grid_layout.addItem(QSpacerItem(500, 50, QSizePolicy.Minimum, QSizePolicy.Expanding), 0, 6) 

graph_label = QLabel('Graph') 
graph_names_combobox = QComboBox() 

grid_layout.addWidget(graph_label, 0, 7, 1, 1) 
grid_layout.addWidget(self.graph_names_combobox, 0, 8, 1, 4) 

self.graph_widget = QStackedWidget() 
grid_layout.addWidget(self.graph_widget, 2, 1, 10, 12) 

self.graph_window_widget = QWidget() 
self.graph_window_widget.setLayout(grid_layout) 

Später ich benutze:

temp_webpage = QWebEngineView() 
temp_webpage.setHTML(*graph html goes here*) 
self.graph_widget.addWidget(temp_webpage) 

# In the course of the full program, a lot of graphs are added, so reloading 
# them all here. 
for child in self.graph_widget.children() 
    if type(child) == QWebEngineView: 
     child.page().action(QWebEnginePage.Reload).trigger() 

ich versucht habe Recht, den Reload-Code verwenden, nachdem ich es das Set gestapelt Widget zu der ausgewählten Grafik, aber wie ich schon sagte, es hat das gleiche Ergebnis.

Gibt es eine Möglichkeit, um die Seite das gleiche wie Rechtsklick zu machen -> neu laden?

bearbeiten

Als Reaktion auf einen Kommentar, der Code verwende ich die HTML zu erzeugen, aus diesem kommt (Daten ist ein Pandas Datenrahmen, die ich von SQL woanders laden, aber ich habe ein Spielzeug Dataframe enthalten hier):

path = QDir.current().filePath('plotly-latest.min.js') 
local = QUrl.fromLocalFile(path).toString() 

data_frame = DataFrame(index=(range(2)),columns=('Date', 'SKUs', 'Lines', 'Orders', 'Eaches')) 

data_frame.loc[0:1,'Date'] = (datetime.date(1999, 1, 1), datetime.date(1999, 1, 2)) 
data_frame.loc[0:1,'SKUs'] = (12, 13) 
data_frame.loc[0:1,'Lines'] = (14, 15) 
data_frame.loc[0:1,'Orders'] = (16, 17) 
data_frame.loc[0:1,'Eaches'] = (18, 19) 

trace_lines = Bar(x=data_frame['Date'], y=data_frame['Lines'], name='Lines', visible=True) 
      trace_orders = Bar(x=data_frame['Date'], y=data_frame['Orders'], name='Orders', visible=False) 
      trace_eaches = Bar(x=data_frame['Date'], y=data_frame['Eaches'], name='Eaches', visible=False) 
      trace_SKUs = Bar(x=data_frame['Date'], y=data_frame['SKUs'], name='SKUs', visible=False) 

data = [trace_lines, trace_orders, trace_eaches, trace_SKUs] 

lines_title = "%s Lines" % name 
orders_title = "%s Orders" % name 
eaches_title = "%s Eaches" % name 
skus_title = "%s SKUs" % name 

update_menus = list([dict(active=0, 
            buttons=list([dict(label='Lines', 
                method='update', 
                args=[{'visible': [True, False, False, False]}, 
                  {'title': lines_title}]), 
               dict(label='Orders', 
                method='update', 
                args=[{'visible': [False, True, False, False]}, 
                  {'title': orders_title}]), 
               dict(label='Eaches', 
                method='update', 
                args=[{'visible': [False, False, True, False]}, 
                  {'title': eaches_title}]), 
               dict(label='SKUs', 
                method='update', 
                args=[{'visible': [False, False, False, True]}, 
                  {'title': skus_title}])]))]) 

layout = dict(title=lines_title, showlegend=False, updatemenus=update_menus, xaxis=dict(
      rangeselector=dict(buttons=list([dict(count=1, label='1m', step='month', stepmode='backward'), 
              dict(count=6, label='6m', step='month', stepmode='backward'), 
              dict(step='all')])), 
      rangeslider=dict(), 
      type='date' 
     )) 

fig = dict(data=data, layout=layout) 

raw_html = '<html><head><meta charset="utf-8" /><script src="{}"></script></head>'.format(local) 
raw_html += '<body>' 
raw_html += plot(fig, include_plotlyjs=False, output_type='div') 
raw_html += '</body></html>' 

return raw_html 
+0

Sie einen Code zur Verfügung stellen könnte, die repro duziert Ihren Fehler (mit dem notwendigen HTML, da dies das Hauptelement ist, das den Fehler erzeugt), viele habe ich QWebEngineView benutzt und ich hatte dieses Problem nicht, vielleicht ist es ein bestimmtes Problem und ich möchte den Code nicht von a erstellen beginne den Fehler zu beobachten und beobachte ihn vielleicht nie. – eyllanesc

+0

Es ist schwer zu erklären, aber ich kann das HTML nicht wirklich teilen. Es lädt plotly-min.js von einer lokalen Quelle, so dass ich nicht mit dem Internet verbunden sein muss, um es zu benutzen, also müsste es geändert werden, bevor du es ausführst. Ich kann Ihnen den Code geben, der HTML erzeugt, wenn das helfen würde. –

+0

Natürlich kann ich aus beruflichen Gründen dieses bestimmte Projekt nicht teilen, aber wenn Sie ein anderes Projekt teilen, das den Fehler reproduziert, würde es mir helfen, es zu testen und Lösungen vorschlagen zu können. – eyllanesc

Antwort

1

eine mögliche Lösung ist die Seite zum zweiten Mal neu geladen werden, wie unten dargestellt:

self.isFirst = True 
    temp_webpage.loadFinished.connect(self.onLoadFinished) 

def onLoadFinished(self, ok): 
    if self.isFirst: 
     # self.sender().page().action(QWebEnginePage.Reload).trigger() 
     self.sender().reload() 
    self.isFirst = False