Qt - QLineEdit не обновляет страницу и URL - PullRequest
0 голосов
/ 29 ноября 2018

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

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Ваша настоящая проблема в том, что вы определили две локальные переменные (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 голосов
/ 29 ноября 2018

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

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

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

...