Qt — QLineEdit не обновляет страницу и URL

У меня небольшая проблема с моим проектом веб-браузера. Всякий раз, когда я ввожу 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;
}

0

Решение

Ваша настоящая проблема в том, что вы определили две локальные переменные (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_). Также многие компиляторы должны предупреждать об этом.

0

Другие решения

Теперь я чувствую себя идиотом, потому что мне удалось решить эту проблему и единственное, что нужно сделать было удалить следующие строки:

QLineEdit *urlBar = new QLineEdit;
QWebEngineView *browserView = new QWebEngineView(parent);

Поскольку эти объекты уже были инициализированы.

0

По вопросам рекламы [email protected]