У меня небольшая проблема с моим проектом веб-браузера. Всякий раз, когда я ввожу URL-адрес (через QLineEdit), браузер не показывает страницу, и всякий раз, когда я меняю страницу (посредством щелчка по сайту с включенной стартовой страницей), адрес не отображается в строке URL-адреса.
Вот мой код mainwindow.cpp. Программа выполняется и завершается с кодом 0. Я попытался использовать qDebug внутри функций (changeUrlBar (QUrl) и setUrl ()), и оказалось, что программа входит в эти функции, но они ничего не делают. Каждый совет будет очень признателен.
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
browserView(new QWebEngineView),
urlBar(new QLineEdit)
{
ui->setupUi(this);
//
// initialization of widgets and layouts
// widgets
QWidget *browserWindow = new QWidget(this);
QLineEdit *urlBar = new QLineEdit;
QProgressBar *progressBar = new QProgressBar;
// WebEngineView - actual web browser
QWebEngineView *browserView = new QWebEngineView(parent);
// layouts
QVBoxLayout *mainLayout = new QVBoxLayout;
QHBoxLayout *topBarLayout = new QHBoxLayout;
// push buttons
QPushButton *buttonBack = new QPushButton("Back");
QPushButton *buttonForward = new QPushButton("Forward");
QPushButton *buttonReload = new QPushButton("Reload");
//
// creating the widgets and layouts
// top bar
topBarLayout->addWidget(buttonBack);
topBarLayout->addWidget(buttonForward);
topBarLayout->addWidget(buttonReload);
topBarLayout->addWidget(urlBar);
// main layout of the browser
mainLayout->addLayout(topBarLayout);
mainLayout->addWidget(progressBar);
mainLayout->addWidget(browserView);
browserWindow->setLayout(mainLayout);
setCentralWidget(browserWindow);
//
// connecting slots and signals
// internal connections
connect(buttonBack, SIGNAL(clicked()), browserView, SLOT(back()));
connect(buttonForward, SIGNAL(clicked()), browserView, SLOT(forward()));
connect(buttonReload, SIGNAL(clicked()), browserView, SLOT(reload()));
connect(browserView, SIGNAL(loadProgress(int)), progressBar, SLOT(setValue(int)));
// browser connections
connect(browserView, SIGNAL(urlChanged(QUrl)), this, SLOT(changeUrlBar(QUrl)));
connect(urlBar, SIGNAL(editingFinished()), this, SLOT(setUrl()));// set starting page
browserView->load(QUrl("https://www.wikipedia.org"));
}
void MainWindow::setUrl()
{
browserView->load(QUrl::fromUserInput(urlBar->text()));
}
void MainWindow::changeUrlBar(QUrl)
{
urlBar->setText(browserView->url().toString());
}
MainWindow::~MainWindow()
{
delete ui;
delete browserView;
delete urlBar;
}
Ваша настоящая проблема в том, что вы определили две локальные переменные (urlBar
а также browserView
) которые скрывают декларацию MainWindow::urlBar
а также MainWindow::browserView
,
Эти локальные объекты добавляются в пользовательский интерфейс, но в слотах вы используете объекты-члены (те, которые не были включены в пользовательский интерфейс). Даже когда они инициализируются в конструкторе, они не получают пользовательский ввод и не отображаются в пользовательском интерфейсе.
MainWindow::MainWindow(QWidget *parent) :
// ...
QLineEdit *urlBar = new QLineEdit; // <-- local variable hiding member declaration
QProgressBar *progressBar = new QProgressBar;
// WebEngineView - actual web browser
QWebEngineView *browserView = new QWebEngineView(parent); // <-- local variable hiding member declaration
// ...
void MainWindow::changeUrlBar(QUrl)
{
urlBar->setText(browserView->url().toString()); // <-- urlBar and browserView are members
}
Мораль: избегать сокрытия или осознавать это;). Немного трюки используется для уменьшения этого, чтобы всегда получить доступ к члену через this
(this->urlBar
) или с использованием другой записи для членов (например, m_urlBar
или же urlBar_
). Также многие компиляторы должны предупреждать об этом.
Теперь я чувствую себя идиотом, потому что мне удалось решить эту проблему и единственное, что нужно сделать было удалить следующие строки:
QLineEdit *urlBar = new QLineEdit;
QWebEngineView *browserView = new QWebEngineView(parent);
Поскольку эти объекты уже были инициализированы.