'How To Use Url Schemes With Search Engines In PyQt5

So, I want to be able to also search things up with a search engine but also being able to put in URLs in the url bar, so like a modern web browser like Google Chrome or Firefox. This has to do with Schemes I'm pretty sure and the Scheme part of my script. I tried to put a base url like "https://www.google.com/search?q=" or "https://duckduckgo.com/?q=" but sadly that just errored out, then I tried to put the scheme as the regular https but then I put and else statement which stated that if there is no .com or .ca or www or https:// in the url bar when searched then it will search it up on the search engine, otherwise just put it as a url; that also errored out. So, how could I approach this? Also, any suggestions to how to make this more efficient? Thank you in advance! :D

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtPrintSupport import *
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
from PyQt5 import QtWebEngine
from PyQt5 import QtCore
from PyQt5 import QtGui
import os
import sys
 
app = QApplication(sys.argv)
 
class MainWindow(QMainWindow):
    #Constructor.
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.browser = QWebEngineView()
        self.browser.setUrl(QUrl("https://www.google.com"))
        self.setCentralWidget(self.browser)
        self.setWindowIcon(QtGui.QIcon("Thing.png"))
        self.setStyleSheet("border: 0.2px solid black;")
        self.showMaximized()
 
        self.tabs = QTabWidget()
 
        self.tabs.setDocumentMode(True)
 
        self.tabs.tabBarDoubleClicked.connect(self.tab_open_doubleclick)
 
        self.tabs.currentChanged.connect(self.current_tab_changed)
 
        self.tabs.setTabsClosable(True)
 
        self.tabs.tabCloseRequested.connect(self.close_current_tab)
 
        self.setCentralWidget(self.tabs)
 
        self.status = QStatusBar()
 
        self.setStatusBar(self.status)
 
        navtb = QToolBar("Navigation")
 
        self.addToolBar(navtb)
 
        back_btn = QAction("Back.", self)
        #Setting status tip.
        back_btn.setStatusTip("Go Back To Previous Page.")
        #Adding action to back button.
        #Making current tab go back.
        back_btn.triggered.connect(lambda: self.tabs.currentWidget().back())
        #Adding this to the navigation tool bar.
        navtb.addAction(back_btn)
 
        next_btn = QAction("Forward.", self)
        next_btn.setStatusTip("Go Forward To Next Page.")
        next_btn.triggered.connect(lambda: self.tabs.currentWidget().forward())
        navtb.addAction(next_btn)
 
        #url_view = QAction("Url View", self)
        #url_view.setStatusTip(webEngineView.url().toString())
        #url_view.triggered.connect(lambda: self.tabs.currentWidget().forward())
        #navtb.addAction(url_view)
 
        reload_btn = QAction("Refresh.", self)
        reload_btn.setStatusTip("Reload The Page.")
        reload_btn.triggered.connect(lambda: self.tabs.currentWidget().reload())
        navtb.addAction(reload_btn)
 
        home_btn = QAction("Home.", self)
        home_btn.setStatusTip("Go To The Home Page.")
 
        home_btn.triggered.connect(self.navigate_home)
        navtb.addAction(home_btn)
 
        navtb.addSeparator()
 
        self.urlbar = QLineEdit()
 
        self.urlbar.returnPressed.connect(self.navigate_to_url)
 
        navtb.addWidget(self.urlbar)
 
        stop_btn = QAction("Stop.", self)
        stop_btn.setStatusTip("Stop Loading The Current Page.")
        stop_btn.triggered.connect(lambda: self.tabs.currentWidget().stop())
        navtb.addAction(stop_btn)
 
        self.add_new_tab(QUrl("https://www.google.com"), "Homepage")
 
        self.show()
 
        self.setWindowTitle("")
 
    def add_new_tab(self, qurl = None, label ="Blank"):
 
        if qurl is None:
            qurl = QUrl("https://www.google.com")
 
        browser = QWebEngineView()
 
        browser.setUrl(qurl)
 
        i = self.tabs.addTab(browser, label)
        self.tabs.setCurrentIndex(i)
 
        #Update the url
        browser.urlChanged.connect(lambda qurl, browser = browser:
                                   self.update_urlbar(qurl, browser))
 
        browser.loadFinished.connect(lambda _, i = i, browser = browser:
                                     self.tabs.setTabText(i, browser.page().title()))
 
def tab_open_doubleclick(self, i):
        if i == -1:
            #Creating a new tab.
            self.add_new_tab()
 
    def current_tab_changed(self, i):
 
        qurl = self.tabs.currentWidget().url()
 
        self.update_urlbar(qurl, self.tabs.currentWidget())
 
        self.update_title(self.tabs.currentWidget())
 
    def close_current_tab(self, i):
 
        if self.tabs.count() < 2:
            return
        page = self.tabs.widget(i)
        self.tabs.removeTab(i)
        page.deleteLater()
 
        #self.tabs.removeTab(i)
 
    def update_title(self, browser):
 
        #If signal is not from the current tab.
        if browser != self.tabs.currentWidget():
            #Then do nothing.
            return
 
        title = self.tabs.currentWidget().page().title()
 
        page_icon = self.tabs.currentWidget().page().icon()
        self.setWindowTitle("")
        #self.setWindowTitle("")
 
    #Action to go to home.
    def navigate_home(self):
 
        self.tabs.currentWidget().setUrl(QUrl("https://www.google.com"))
 
    def navigate_to_url(self):
 
        #Convert it to QUrl object.
        q = QUrl(self.urlbar.text())
 
        if q.scheme() == "":
            qurl = (self.tabs.currentWidget()).url()
            q.setScheme("https")
 
        self.tabs.currentWidget().setUrl(q)
 
    def update_urlbar(self, q, browser = None):
 
        if browser != self.tabs.currentWidget():
 
            return
 
        self.urlbar.setText(q.toString())
 
        #Set cursor position.
        self.urlbar.setCursorPosition(0)
 
app = QApplication(sys.argv)
 
app.setApplicationName("")
 
window = MainWindow()
 
app.exec_()


Solution 1:[1]

You can use QUrl.FromUserInput:

def navigate_to_url(self):
        #Convert it to QUrl object.
        q = QUrl.FromUserInput(self.urlbar.text())
        if qurl.isValid():
            self.browser.load(qurl)
        else: 
            qurl = QUrl("https://duckduckgo.com/?q=%s" % q)
            self.browser.load(qurl)

But this doesn't work if the URL contain only one word.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1