1 pièce(s) jointe(s)
Comment avoir un QWebEngineView enfant d'un QTabWidget ?
Bonjour,
je suis en train d'apprendre le C++ et la bibliothèque Qt (version 6.2.2) et je suis sur un petit projet de navigateur basique avec QWebEngineView j'ai ça comme code d'écrit:
fp.ui (code et screenshot) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
| <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>fp</class>
<widget class="QMainWindow" name="fp">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>956</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>fp</string>
</property>
<widget class="QWidget" name="fp_main">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="main_lay">
<item row="1" column="2">
<widget class="QPushButton" name="bt_back">
<property name="text">
<string>Back</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="bt_next">
<property name="text">
<string>next</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="bt_home">
<property name="text">
<string>home</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QPushButton" name="bt_refresh">
<property name="text">
<string>Refresh</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="7">
<widget class="QTabWidget" name="onglet">
<property name="tabPosition">
<enum>QTabWidget::North</enum>
</property>
<property name="tabShape">
<enum>QTabWidget::Rounded</enum>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<property name="documentMode">
<bool>false</bool>
</property>
<property name="tabsClosable">
<bool>true</bool>
</property>
<property name="movable">
<bool>true</bool>
</property>
<widget class="QWidget" name="home">
<attribute name="title">
<string>home</string>
</attribute>
</widget>
</widget>
</item>
<item row="1" column="5">
<widget class="QLineEdit" name="in_url"/>
</item>
<item row="1" column="6">
<widget class="QPushButton" name="bt_add">
<property name="text">
<string>+</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections>
<connection>
<sender>bt_add</sender>
<signal>clicked()</signal>
<receiver>fp</receiver>
<slot>newtab()</slot>
<hints>
<hint type="sourcelabel">
<x>784</x>
<y>20</y>
</hint>
<hint type="destinationlabel">
<x>810</x>
<y>40</y>
</hint>
</hints>
</connection>
<connection>
<sender>onglet</sender>
<signal>tabCloseRequested(int)</signal>
<receiver>fp</receiver>
<slot>deltab()</slot>
<hints>
<hint type="sourcelabel">
<x>141</x>
<y>71</y>
</hint>
<hint type="destinationlabel">
<x>-64</x>
<y>59</y>
</hint>
</hints>
</connection>
<connection>
<sender>in_url</sender>
<signal>returnPressed()</signal>
<receiver>fp</receiver>
<slot>newpage()</slot>
<hints>
<hint type="sourcelabel">
<x>460</x>
<y>22</y>
</hint>
<hint type="destinationlabel">
<x>470</x>
<y>-25</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>newtab()</slot>
<slot>deltab()</slot>
<slot>newpage()</slot>
</slots>
</ui> |
Pièce jointe 613045Pièce jointe 613045
fp.h :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #ifndef FP_H
#define FP_H
#include <QMainWindow>
#include <QWebEngineView>
#include <QWidget>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui { class fp; }
QT_END_NAMESPACE
class fp : public QMainWindow
{
Q_OBJECT
public:
fp(QWidget *parent = nullptr);
~fp();
public slots:
void newtab();
void deltab();
void newpage();
QWebEngineView * ap();
int cui();
private:
Ui::fp *ui;
QWebEngineView *webnav;
};
#endif // FP_H |
fp.cpp :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include "fp.h"
#include "ui_fp.h"
fp::fp(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::fp)
{
ui->setupUi(this);
ui->in_url->setText("https://google.com");
}
fp::~fp()
{
delete ui;
}
void fp::newtab()
{
QWebEngineView *webnav = new QWebEngineView;
webnav->load(QUrl("https://google.com"));
ui->in_url->setText("https://google.com");
ui->onglet->addTab(webnav,"Home");
}
int fp::cui()
{
return ui->onglet->currentIndex();
}
QWebEngineView *fp::ap()
{
return ui->onglet->currentWidget()->findChild<QWebEngineView *>();
}
void fp::deltab()
{
ui->onglet->removeTab(cui());
}
void fp::newpage()
{
//QString use_url = ui->in_url->text();
QWidget *test = new QWidget;
QGridLayout *lay = new QGridLayout;
QLabel *bt = new QLabel("test");
lay->addWidget(bt);
test->setLayout(lay);
test->showMaximized();
} |
main.cpp :
Code:
1 2 3 4 5 6 7 8 9 10 11
| #include "fp.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
fp w;
w.show();
return a.exec();
} |
le navigateur fonctionne je peux créer/fermer les onglets sans problème là où je bloque c'est quand l'on saisit une url dans le QLineEdit il faut recharger la page affichée dans l'onglet actuel, donc j'ai créé la méthode "newpage" qui est censé faire ça, mais le truc c'est qu'il faut savoir quel QWebEngineView est visualisé actuellement (quel onglet dans le QTabWidget est sélectionné) pour ça le cours de C++ que je suis donnait une méthode que j'ai essayé d'adapter à mon projet sur ces lignes
fp.h :
Code:
QWebEngineView *ap();
fp.cpp :
Code:
1 2 3 4
| QWebEngineView *fp::ap()
{
return ui->onglet->currentWidget()->findChild<QWebEngineView *>();
} |
cette méthode est censé retourner le QWebEngineView enfant de mon QTabWidget (ui->onglet), mais quand j'écris mon url dans mon QLineEdit l'app plante directement :
Citation:
20:16:03: C:\Users\griso\OneDrive\Documents\Qt Project\build-WebNav-Desktop_Qt_6_2_3_MSVC2019_64bit-Debug\debug\WebNav.exe crashed.
j'ai testé et ça semble vraiment être la méthode "ap" qui n'est pas écrite comme elle devrait, étant inexpérimenté je ne sais pas ce qui cloche avec cette méthode. Est-ce que c'est la façon de faire pour interagir avec un QWebEngineView situé dans un QTabWidjet si oui que dois-je changer à la méthode "ap" pour que la méthode "newpage" fonctionne, sinon comment interagir avec le QWebengine ?