Compose pointer to property of object
-
@mrjj
Here's what I'm doing:QWebView *webGUI = new QWebView(this); webGUI->setObjectName(QString::fromUtf8("webGUI")); webGUI->setGeometry(QRect(280, 190, 150, 120)); webGUI->setAcceptDrops(false); webGUI->setStyleSheet(QString::fromUtf8("background-color: rgba(127, 127, 127, 0);")); webGUI->setUrl(QUrl("about:blank")); webGUI->setRenderHints(QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing); webGUI->page()->mainFrame()->setScrollBarPolicy( Qt::Vertical, Qt::ScrollBarAlwaysOff ); webGUI->page()->mainFrame()->setScrollBarPolicy( Qt::Horizontal, Qt::ScrollBarAlwaysOff ); webGUI->setGeometry(0, 0, SCREEN_SIZE_X, SCREEN_SIZE_Y);
This is in a separate function and does not yet have the code to make it create webGUI[01] .. webGUI[n]. I thought of trying with one first.
I currently call this from the main constructor.Before, the concept used only one webGUI that I created in the Designer - everything worked as supposed.
I'm accessing these webGUI's from various places in my code.
-
hi
If you make this into a fine function that returns a QWebView *, you
can easy make more than one.I do wonder how the parent QWebView(this); << the "this" can
show mutiple QWebView ?
will you use a tab control or a stackedwidetget to allow user to flip between the
WEbViews or ill the be in same page and just take a smaller share of it ?
as in share the page/parent ? -
'This' might be one of my problems.
While in Designer I had a centralWidget as parent for all my elements.
The webGUI's are dynamically loaded with content from a local server and are shown/hidden as needed. They also are placed and sized as needed at run-time and cover all of the screen or or only parts, may overlap with transparency ...
There is at least one, but should now be extendable on request.Am I correct that I will need to create webView01 from the constructor at startup and make it available in *.h. Otherwise all the references to it are not satisfied.
All references/calls to any webGui need to make use pof the QList, right.
As you may surely have noted, I never implemented such a logic/functionality before.
Thanks a lot for your help and guidance! -
@McLion said:
-
'This' might be one of my problems.
Well "this" is just the parent. if no parent are giving, it will become a window.
So often this will be mainwindow. There nothing wrong having mutiple
WebViews in same parent but u might need to arrange them to not overlap.
(use move or setGeometry) Since it sounds you will arrange them manually and not use a layout or tabs or something like that. -
Am I correct that I will need to create webView01 from the constructor at startup and make it available in *.h. Otherwise all the references to it are not satisfied.
Well you dont need that.
You can have list
QList< QWebView *> Webs;
QWebView *webGUI = new QWebView(this);
...
Webs.append(webGUI); // keep in list
Then at any time
QWebView *w = Webs[0]; // take from list
or Webs[1] , 2,3,4 etc.So you dont need a named variable to access it.
Also, handling signals. You a can use same slot for all webviews.
the sender() function will tell you which webview
QWebView * wv= qobject_cast<QWebView *>(sender());
if (wv) ...
inside the slot for a signal to know which of the webviews that send the signal.
Not sure you will need it, so just a note :) -
-
Getting forward :-)
The hint with the sender in the signal was great too. As if you would know before, I really stumbled over this - thanks!I came across an issue with the list though.
There are no absolute positions in the list. Saying if 3 entries are made (0,1,2) and the second list (1) is cancelled for instance because it's not needed anymore, former entry 2 becomes entry 1.
QList seems to always fill from the 0 up and there are no absolute positions.I either did not get all of QList or I may need to switch to some other solution - unfortunately- because it otherwise works a treat.
-
hi
Im not sure what wrong with QList since its dynamic and
we cant have invalid pointers around ?
else use a map
http://doc.qt.io/qt-5/qmap.html
QMap<int,QWebView * > map;
QWebView *webGUI = new QWebView(this);
...
map[1] =webGUI ;
map[2] =nextwebGUI ;
...
QWebView *w=map[2]; // it will stay "2"They wont change position as 1,2 is a key
like map["onekey"] =webGUI ;
but we use int as no need for string.
so even if we remove map[1] then
map[2] is still there.So maybe it works better for you ?
-
So far, everything related to this threads question and the QMap as solution seems to work.
I stumbled over something else while relacing the QwebView from the Designer by my 'on-demand' created one:
I can not load an url, it crashes with sig11.I get the following connect error on bootup:
QMetaObject::connectSlotsByName: No matching signal for on_webGUI_loadFinished(bool)
which I dont understand and may be the cause.
I have connected:connect(webGUI, SIGNAL(loadFinished(bool)), this, SLOT(on_webGUI_loadFinished(bool)));
and in *.h as private slot:
void on_webGUI_loadFinished(bool arg1);
This worked before, with the QWebView from the Designer.
Any idea? Thanks. -
@McLion said:
no matching signal for on_webGUI_loadFinished(bool)
Hi
this warning comes as you name slot on_XXX
This will trigger Qt auto connect feature so when you use
a concrete connect you should rename it so it dont
start with on__
(right click it- refactor->rename)also please do
qDebug() << "loadfin:" << connect(webGUI, SIGNAL(loadFinixxxxto see if it returns true; ( as in , it can connect)
-
You're most probably dereferencing a null pointer. Signal 11 means SIGSEGV (segmentation error).
-
@jsulm
Yes - Thanks . Problem loacted, but not yet solved:void QTGUI_MainWindow::populateJavaScriptWindowObject() { QWebView * webGUI = qobject_cast<QWebView *>(sender()); webGUI->page()->mainFrame()->addToJavaScriptWindowObject("NativeBridge", this); }
The sender is the JS and not the QWebView and so I do not get the pointer to the QWebView that I need. Instead, the pointer is 0x0 and then - of course - the addToJ... crashes.
Any idea how I get the pointer to the QWebView from which the JS is sending?
Thanks -
What is JS?