1
0
Fork 0
mirror of synced 2024-06-26 10:11:19 +12:00

Some improvements

This commit is contained in:
Dummerle 2021-06-10 19:58:35 +02:00
parent 337b738599
commit 676c253a13
8 changed files with 114 additions and 144 deletions

View file

@ -1,5 +1,3 @@
import webbrowser
from PyQt5.QtCore import QSize, pyqtSignal
from PyQt5.QtWidgets import QMenu, QTabWidget, QWidget, QWidgetAction
from qtawesome import icon
@ -26,32 +24,23 @@ class TabWidget(QTabWidget):
disabled_tab = 4 if not offline else 1
self.core = core
self.setTabBar(TabBar(disabled_tab))
# Generate Tabs
self.games_tab = GameTab(core, self, offline)
self.addTab(self.games_tab, self.tr("Games"))
if not offline:
updates = self.games_tab.default_widget.game_list.updates
self.downloadTab = DownloadTab(core, updates, self)
self.addTab(self.downloadTab, "Downloads" + (" (" + str(len(updates)) + ")" if len(updates) != 0 else ""))
self.cloud_saves = SyncSaves(core, self)
self.addTab(self.cloud_saves, "Cloud Saves")
self.store = Shop()
self.addTab(self.store, self.tr("Store"))
self.addTab(self.store, self.tr("Store (Beta)"))
self.settings = SettingsTab(core, self)
# Space Tab
self.addTab(QWidget(), "")
self.setTabEnabled(disabled_tab, False)
# Buttons
store_button = TabButtonWidget(core, 'fa.shopping-cart', 'Epic Games Store')
store_button.pressed.connect(lambda: webbrowser.open("https://www.epicgames.com/store"))
self.tabBar().setTabButton(disabled_tab, self.tabBar().RightSide, store_button)
# Button
self.account = QWidget()
self.addTab(self.account, "")
self.setTabEnabled(disabled_tab + 1, False)
@ -151,8 +140,7 @@ class TabWidget(QTabWidget):
self.setTabText(1, "Downloads" + ((" (" + str(downloads) + ")") if downloads != 0 else ""))
self.downloadTab.update_text.setVisible(len(self.downloadTab.update_widgets) == 0)
# Update gamelist and set text of Downlaods to "Downloads"
# Update gamelist and set text of Downloads to "Downloads"
def dl_finished(self, update_list):
if update_list[0]:
self.games_tab.default_widget.game_list.update_list(update_list[1])

View file

@ -22,6 +22,7 @@ class Shop(QStackedWidget):
self.addWidget(self.info)
self.info.back_button.clicked.connect(lambda: self.setCurrentIndex(0))
self.search_results.back_button.clicked.connect(lambda: self.setCurrentIndex(0))
self.shop.show_info.connect(self.show_info)
self.shop.show_game.connect(self.show_game_info)
@ -37,4 +38,3 @@ class Shop(QStackedWidget):
def show_info(self, data):
self.search_results.show_results(data)
self.setCurrentIndex(1)

View file

@ -13,7 +13,7 @@ class SearchResults(QWidget):
def __init__(self):
super(SearchResults, self).__init__()
self.main_layout = QVBoxLayout()
self.back_button = QPushButton()
self.back_button = QPushButton(self.tr("Back"))
self.main_layout.addWidget(self.back_button)
self.main_layout.addWidget(self.back_button)
self.result_area = QScrollArea()

View file

@ -36,7 +36,7 @@ class ShopGame:
else:
self.links = []
self.languages = langs
self.reqs = reqs # {"Betriebssystem":win7, processor:i9 9900k, ram...}; Note: name from language
self.reqs = reqs
self.publisher = publisher
self.developer = developer
self.price = original_price
@ -44,7 +44,6 @@ class ShopGame:
@classmethod
def from_json(cls, api_data: dict, search_data: dict):
print(api_data)
if isinstance(api_data, list):
for product in api_data:
if product["_title"] == "home":
@ -66,8 +65,10 @@ class ShopGame:
for i, system in enumerate(api_data["data"]["requirements"]["systems"]):
tmp.reqs[system["systemType"]] = {}
for req in system["details"]:
tmp.reqs[system["systemType"]][req["title"]] = (req["minimum"], req["recommended"])
try:
tmp.reqs[system["systemType"]][req["title"]] = (req["minimum"], req["recommended"])
except KeyError:
pass
tmp.publisher = api_data["data"]["meta"].get("publisher", "undefined")
tmp.developer = api_data["data"]["meta"].get("developer", "undefined")
tmp.price = search_data['price']['totalPrice']['fmtPrice']['originalPrice']

View file

@ -6,17 +6,18 @@ from json import JSONDecodeError
import requests
from PyQt5 import QtGui
from PyQt5.QtCore import Qt, pyqtSignal, QUrl, QByteArray, QJsonDocument, QJsonParseError, \
from PyQt5.QtCore import Qt, pyqtSignal, QUrl, QJsonDocument, QJsonParseError, \
QStringListModel
from PyQt5.QtGui import QPixmap
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout, QCompleter
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QCompleter, QGroupBox, QHBoxLayout
from rare.ui.components.tabs.store.store import Ui_ShopWidget
from rare.utils.extra_widgets import WaitingSpinner, ImageLabel
from rare.utils.extra_widgets import WaitingSpinner, ImageLabel, FlowLayout
from rare.utils.utils import get_lang
# noinspection PyAttributeOutsideInit,PyBroadException
class ShopWidget(QWidget, Ui_ShopWidget):
show_info = pyqtSignal(list)
show_game = pyqtSignal(dict)
@ -25,10 +26,17 @@ class ShopWidget(QWidget, Ui_ShopWidget):
def __init__(self):
super(ShopWidget, self).__init__()
self.setupUi(self)
self.search_results.setVisible(False)
self.manager = QNetworkAccessManager()
self.free_games_widget = QWidget()
self.free_games_widget.setLayout(FlowLayout())
self.free_games_now = QGroupBox(self.tr("Free Games"))
self.free_games_now.setLayout(QHBoxLayout())
self.free_games_widget.layout().addWidget(self.free_games_now)
self.coming_free_games = QGroupBox(self.tr("Free Games next week"))
self.coming_free_games.setLayout(QHBoxLayout())
self.free_games_widget.layout().addWidget(self.coming_free_games)
self.free_games_stack.addWidget(WaitingSpinner())
self.free_games_stack.setCurrentIndex(1)
self.free_games_stack.addWidget(self.free_games_widget)
self.search.textChanged.connect(self.search_games)
self.completer = QCompleter()
self.completer.setCaseSensitivity(Qt.CaseInsensitive)
@ -45,8 +53,7 @@ class ShopWidget(QWidget, Ui_ShopWidget):
os.makedirs(self.path)
url = "https://store-site-backend-static.ak.epicgames.com/freeGamesPromotions"
self.free_game_request = self.manager.get(QNetworkRequest(QUrl(url)))
self.free_game_request.readyRead.connect(self.add_free_games)
self.free_game_request.finished.connect(self.free_game_request.deleteLater if self.free_game_request else None)
self.free_game_request.finished.connect(self.add_free_games)
# free_games = api_utils.get_free_games()
@ -71,20 +78,30 @@ class ShopWidget(QWidget, Ui_ShopWidget):
continue
try:
# parse datetime
end_date = datetime.datetime.strptime(
game["promotions"].get("promotionalOffers", game["promotions"].get("upcomingPromotionalOffers"))[0][
"promotionalOffers"][0]["endDate"],
'%Y-%m-%dT%H:%M:%S.%fZ')
start_date = datetime.datetime.strptime(
game["promotions"].get("promotionalOffers", game["promotions"].get("upcomingPromotionalOffers"))[0][
"promotionalOffers"][0]["startDate"],
'%Y-%m-%dT%H:%M:%S.%fZ')
except IndexError:
print("index error")
continue
except KeyError:
print("keyerror")
continue
try:
end_date = datetime.datetime.strptime(
game["promotions"]["upcomingPromotionalOffers"][0]["promotionalOffers"][0]["endDate"],
'%Y-%m-%dT%H:%M:%S.%fZ')
except Exception:
try:
end_date = datetime.datetime.strptime(
game["promotions"]["promotionalOffers"][0]["promotionalOffers"][0]["endDate"],
'%Y-%m-%dT%H:%M:%S.%fZ')
except Exception:
continue
try:
start_date = datetime.datetime.strptime(
game["promotions"]["upcomingPromotionalOffers"][0]["promotionalOffers"][0]["startDate"],
'%Y-%m-%dT%H:%M:%S.%fZ')
except Exception:
try:
start_date = datetime.datetime.strptime(
game["promotions"]["promotionalOffers"][0]["promotionalOffers"][0]["startDate"],
'%Y-%m-%dT%H:%M:%S.%fZ')
except Exception as e:
print(e)
continue
except TypeError:
print("type error")
continue
@ -95,30 +112,29 @@ class ShopWidget(QWidget, Ui_ShopWidget):
for free_game in free_games_now:
w = GameWidget(free_game, self.path)
w.show_info.connect(lambda x: self.search_games(x, True))
self.free_game_now.layout().addWidget(w)
w.show_info.connect(self.show_game.emit)
self.free_games_now.layout().addWidget(w)
self.free_game_widgets.append(w)
self.free_game_group_box_2.setMinimumHeight(200)
self.free_games_now.layout().addStretch(1)
for free_game in coming_free_games:
w = GameWidget(free_game, self.path)
if free_game["title"] != "Mystery Game":
w.show_info.connect(self.show_info)
self.comming_free_game.layout().addWidget(w)
w.show_info.connect(self.show_game.emit)
self.coming_free_games.layout().addWidget(w)
self.free_game_widgets.append(w)
self.free_games_stack.setCurrentIndex(0)
self.coming_free_games.layout().addStretch(1)
# self.coming_free_games.setFixedWidth(int(40 + len(coming_free_games) * 300))
self.free_games_stack.setCurrentIndex(1)
self.free_game_request.deleteLater()
def search_games(self, text, show_direct=False):
if text == "":
self.search_results.setVisible(False)
else:
locale = get_lang()
payload = QByteArray()
payload.append(
"query=query searchStoreQuery($allowCountries: String, $category: String, $count: Int, $country: String!, $keywords: String, $locale: String, $namespace: String, $withMapping: Boolean = false, $itemNs: String, $sortBy: String, $sortDir: String, $start: Int, $tag: String, $releaseDate: String, $withPrice: Boolean = false, $withPromotions: Boolean = false, $priceRange: String, $freeGame: Boolean, $onSale: Boolean, $effectiveDate: String) {\n Catalog {\n searchStore(\n allowCountries: $allowCountries\n category: $category\n count: $count\n country: $country\n keywords: $keywords\n locale: $locale\n namespace: $namespace\n itemNs: $itemNs\n sortBy: $sortBy\n sortDir: $sortDir\n releaseDate: $releaseDate\n start: $start\n tag: $tag\n priceRange: $priceRange\n freeGame: $freeGame\n onSale: $onSale\n effectiveDate: $effectiveDate\n ) {\n elements {\n title\n id\n namespace\n description\n effectiveDate\n keyImages {\n type\n url\n }\n currentPrice\n seller {\n id\n name\n }\n productSlug\n urlSlug\n url\n tags {\n id\n }\n items {\n id\n namespace\n }\n customAttributes {\n key\n value\n }\n categories {\n path\n }\n catalogNs @include(if: $withMapping) {\n mappings(pageType: \"productHome\") {\n pageSlug\n pageType\n }\n }\n offerMappings @include(if: $withMapping) {\n pageSlug\n pageType\n }\n price(country: $country) @include(if: $withPrice) {\n totalPrice {\n discountPrice\n originalPrice\n voucherDiscount\n discount\n currencyCode\n currencyInfo {\n decimals\n }\n fmtPrice(locale: $locale) {\n originalPrice\n discountPrice\n intermediatePrice\n }\n }\n lineOffers {\n appliedRules {\n id\n endDate\n discountSetting {\n discountType\n }\n }\n }\n }\n promotions(category: $category) @include(if: $withPromotions) {\n promotionalOffers {\n promotionalOffers {\n startDate\n endDate\n discountSetting {\n discountType\n discountPercentage\n }\n }\n }\n upcomingPromotionalOffers {\n promotionalOffers {\n startDate\n endDate\n discountSetting {\n discountType\n discountPercentage\n }\n }\n }\n }\n }\n paging {\n count\n total\n }\n }\n }\n}\n")
payload = json.dumps({
"query": "query searchStoreQuery($allowCountries: String, $category: String, $count: Int, $country: String!, $keywords: String, $locale: String, $namespace: String, $withMapping: Boolean = false, $itemNs: String, $sortBy: String, $sortDir: String, $start: Int, $tag: String, $releaseDate: String, $withPrice: Boolean = false, $withPromotions: Boolean = false, $priceRange: String, $freeGame: Boolean, $onSale: Boolean, $effectiveDate: String) {\n Catalog {\n searchStore(\n allowCountries: $allowCountries\n category: $category\n count: $count\n country: $country\n keywords: $keywords\n locale: $locale\n namespace: $namespace\n itemNs: $itemNs\n sortBy: $sortBy\n sortDir: $sortDir\n releaseDate: $releaseDate\n start: $start\n tag: $tag\n priceRange: $priceRange\n freeGame: $freeGame\n onSale: $onSale\n effectiveDate: $effectiveDate\n ) {\n elements {\n title\n id\n namespace\n description\n effectiveDate\n keyImages {\n type\n url\n }\n currentPrice\n seller {\n id\n name\n }\n productSlug\n urlSlug\n url\n tags {\n id\n }\n items {\n id\n namespace\n }\n customAttributes {\n key\n value\n }\n categories {\n path\n }\n catalogNs @include(if: $withMapping) {\n mappings(pageType: \"productHome\") {\n pageSlug\n pageType\n }\n }\n offerMappings @include(if: $withMapping) {\n pageSlug\n pageType\n }\n price(country: $country) @include(if: $withPrice) {\n totalPrice {\n discountPrice\n originalPrice\n voucherDiscount\n discount\n currencyCode\n currencyInfo {\n decimals\n }\n fmtPrice(locale: $locale) {\n originalPrice\n discountPrice\n intermediatePrice\n }\n }\n lineOffers {\n appliedRules {\n id\n endDate\n discountSetting {\n discountType\n }\n }\n }\n }\n promotions(category: $category) @include(if: $withPromotions) {\n promotionalOffers {\n promotionalOffers {\n startDate\n endDate\n discountSetting {\n discountType\n discountPercentage\n }\n }\n }\n upcomingPromotionalOffers {\n promotionalOffers {\n startDate\n endDate\n discountSetting {\n discountType\n discountPercentage\n }\n }\n }\n }\n }\n paging {\n count\n total\n }\n }\n }\n}\n",
"query": query,
"variables": {"category": "games/edition/base|bundles/games|editors|software/edition/base", "count": 10,
"country": "DE", "keywords": text, "locale": locale, "sortDir": "DESC",
"allowCountries": locale.upper(),
@ -127,7 +143,6 @@ class ShopWidget(QWidget, Ui_ShopWidget):
request = QNetworkRequest(QUrl("https://www.epicgames.com/graphql"))
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json")
self.search_request = self.manager.post(request, payload)
# self.search_request = self.manager.post(QNetworkRequest(QUrl("https://www.epicgames.com/graphql")), payload)
self.search_request.finished.connect(lambda: self.show_search_results(show_direct))
def show_search_results(self, show_direct=False):
@ -167,16 +182,22 @@ class ShopWidget(QWidget, Ui_ShopWidget):
if self.data:
self.show_info.emit(self.data)
else:
self.show_game.emit(self.data[0])
try:
result = self.data[0]
except IndexError:
print("error")
return
self.show_game.emit(result)
class GameWidget(QWidget):
show_info = pyqtSignal(str)
show_info = pyqtSignal(dict)
def __init__(self, json_info, path: str):
super(GameWidget, self).__init__()
self.layout = QVBoxLayout()
self.image = ImageLabel()
self.json_info = json_info
for img in json_info["keyImages"]:
if img["type"] in ["DieselStoreFrontWide", "VaultClosed"]:
width = 300
@ -213,4 +234,36 @@ class GameWidget(QWidget):
self.setLayout(self.layout)
def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None:
self.show_info.emit(self.title)
self.show_info.emit(self.json_info)
query = "query searchStoreQuery($allowCountries: String, $category: String, $count: Int, $country: String!, " \
"$keywords: String, $locale: String, $namespace: String, $withMapping: Boolean = false, $itemNs: String, " \
"$sortBy: String, $sortDir: String, $start: Int, $tag: String, $releaseDate: String, $withPrice: Boolean = " \
"false, $withPromotions: Boolean = false, $priceRange: String, $freeGame: Boolean, $onSale: Boolean, " \
"$effectiveDate: String) {\n Catalog {\n searchStore(\n allowCountries: $allowCountries\n " \
"category: $category\n count: $count\n country: $country\n keywords: $keywords\n locale: " \
"$locale\n namespace: $namespace\n itemNs: $itemNs\n sortBy: $sortBy\n sortDir: " \
"$sortDir\n releaseDate: $releaseDate\n start: $start\n tag: $tag\n priceRange: " \
"$priceRange\n freeGame: $freeGame\n onSale: $onSale\n effectiveDate: $effectiveDate\n ) {" \
"\n elements {\n title\n id\n namespace\n description\n " \
"effectiveDate\n keyImages {\n type\n url\n }\n currentPrice\n " \
"seller {\n id\n name\n }\n productSlug\n urlSlug\n url\n " \
" tags {\n id\n }\n items {\n id\n namespace\n }\n " \
"customAttributes {\n key\n value\n }\n categories {\n path\n " \
"}\n catalogNs @include(if: $withMapping) {\n mappings(pageType: \"productHome\") {\n " \
" pageSlug\n pageType\n }\n }\n offerMappings @include(if: $withMapping) " \
"{\n pageSlug\n pageType\n }\n price(country: $country) @include(if: " \
"$withPrice) {\n totalPrice {\n discountPrice\n originalPrice\n " \
"voucherDiscount\n discount\n currencyCode\n currencyInfo {\n " \
"decimals\n }\n fmtPrice(locale: $locale) {\n originalPrice\n " \
"discountPrice\n intermediatePrice\n }\n }\n lineOffers {\n " \
" appliedRules {\n id\n endDate\n discountSetting {\n " \
"discountType\n }\n }\n }\n }\n promotions(category: " \
"$category) @include(if: $withPromotions) {\n promotionalOffers {\n promotionalOffers {\n " \
" startDate\n endDate\n discountSetting {\n " \
"discountType\n discountPercentage\n }\n }\n }\n " \
"upcomingPromotionalOffers {\n promotionalOffers {\n startDate\n " \
"endDate\n discountSetting {\n discountType\n discountPercentage\n " \
" }\n }\n }\n }\n }\n paging {\n count\n " \
"total\n }\n }\n }\n}\n "

View file

@ -20,54 +20,32 @@ class Ui_ShopWidget(object):
self.search = QtWidgets.QLineEdit(ShopWidget)
self.search.setObjectName("search")
self.verticalLayout.addWidget(self.search)
self.search_results = QtWidgets.QGroupBox(ShopWidget)
self.search_results.setFlat(False)
self.search_results.setObjectName("search_results")
self.verticalLayout.addWidget(self.search_results)
self.free_game_group_box_2 = QtWidgets.QGroupBox(ShopWidget)
self.free_game_group_box_2.setObjectName("free_game_group_box_2")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.free_game_group_box_2)
self.free_game_group_box = QtWidgets.QGroupBox(ShopWidget)
self.free_game_group_box.setObjectName("free_game_group_box")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.free_game_group_box)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.free_games_stack = QtWidgets.QStackedWidget(self.free_game_group_box_2)
self.free_games_stack = QtWidgets.QStackedWidget(self.free_game_group_box)
self.free_games_stack.setObjectName("free_games_stack")
self.free_games_page = QtWidgets.QWidget()
self.free_games_page.setObjectName("free_games_page")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.free_games_page)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.free_game_now = QtWidgets.QGroupBox(self.free_games_page)
self.free_game_now.setObjectName("free_game_now")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.free_game_now)
self.horizontalLayout.setObjectName("horizontalLayout")
self.horizontalLayout_3.addWidget(self.free_game_now)
self.comming_free_game = QtWidgets.QGroupBox(self.free_games_page)
self.comming_free_game.setObjectName("comming_free_game")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.comming_free_game)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.horizontalLayout_3.addWidget(self.comming_free_game)
self.free_games_stack.addWidget(self.free_games_page)
self.verticalLayout_2.addWidget(self.free_games_stack)
self.verticalLayout.addWidget(self.free_game_group_box_2)
self.games_groupbox_2 = QtWidgets.QGroupBox(ShopWidget)
self.games_groupbox_2.setObjectName("games_groupbox_2")
self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.games_groupbox_2)
self.verticalLayout.addWidget(self.free_game_group_box)
self.games_groupbox = QtWidgets.QGroupBox(ShopWidget)
self.games_groupbox.setObjectName("games_groupbox")
self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.games_groupbox)
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.verticalLayout.addWidget(self.games_groupbox_2)
self.verticalLayout.addWidget(self.games_groupbox)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem)
self.retranslateUi(ShopWidget)
self.free_games_stack.setCurrentIndex(0)
self.free_games_stack.setCurrentIndex(-1)
QtCore.QMetaObject.connectSlotsByName(ShopWidget)
def retranslateUi(self, ShopWidget):
_translate = QtCore.QCoreApplication.translate
ShopWidget.setWindowTitle(_translate("ShopWidget", "Form"))
self.search.setPlaceholderText(_translate("ShopWidget", "Search Games"))
self.search_results.setTitle(_translate("ShopWidget", "Search results"))
self.free_game_group_box_2.setTitle(_translate("ShopWidget", "Free Games"))
self.free_game_now.setTitle(_translate("ShopWidget", "Free Game"))
self.comming_free_game.setTitle(_translate("ShopWidget", "Comming Free Game"))
self.games_groupbox_2.setTitle(_translate("ShopWidget", "Other nice games"))
self.free_game_group_box.setTitle(_translate("ShopWidget", "Free Games"))
self.games_groupbox.setTitle(_translate("ShopWidget", "Other nice games"))
if __name__ == "__main__":

View file

@ -22,17 +22,7 @@
</widget>
</item>
<item>
<widget class="QGroupBox" name="search_results">
<property name="title">
<string>Search results</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QGroupBox" name="free_game_group_box_2">
<widget class="QGroupBox" name="free_game_group_box">
<property name="title">
<string>Free Games</string>
</property>
@ -40,35 +30,15 @@
<item>
<widget class="QStackedWidget" name="free_games_stack">
<property name="currentIndex">
<number>0</number>
<number>-1</number>
</property>
<widget class="QWidget" name="free_games_page">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QGroupBox" name="free_game_now">
<property name="title">
<string>Free Game</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout"/>
</widget>
</item>
<item>
<widget class="QGroupBox" name="comming_free_game">
<property name="title">
<string>Comming Free Game</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2"/>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="games_groupbox_2">
<widget class="QGroupBox" name="games_groupbox">
<property name="title">
<string>Other nice games</string>
</property>

20
test.py
View file

@ -1,20 +0,0 @@
import sys
from PyQt5.QtCore import Qt, QStringListModel
from PyQt5.QtWidgets import QApplication, QCompleter, QLineEdit
def get_data(model):
model.setStringList(["completion", "data", "goes", "here"])
if __name__ == "__main__":
app = QApplication(sys.argv)
edit = QLineEdit()
completer = QCompleter()
edit.setCompleter(completer)
model = QStringListModel()
completer.setModel(model)
get_data(model)
edit.show()
sys.exit(app.exec_())