#python #qt #pyqt #pyqt5 #qt5
#python #qt #pyqt #pyqt5 #qt5
Вопрос:
Итак, я пытаюсь создать заставку для своего приложения; заставка — это QMainWindow, а основная программа также QMainWindow. Проблема в том, что когда я скрываю заставку и показываю основную программу, у нее нет своего отдельного окна, которое можно свернуть и обработать, как остальные программы Windows. как я могу этого добиться?
вот код для моей заставки
* Обновлено: изменен экран-заставка с QMainWindow на QWidget
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import os
import sys
class ThreadProgress(QThread):
mysignal = pyqtSignal(int)
def __init__(self, parent=None):
QThread.__init__(self, parent)
def run(self):
# here I list all my imports
self.mysignal.emit(100)
class Splash(QWidget):
def __init__(self, parent = None):
super(Splash, self).__init__(parent)
self.setWindowFlags(Qt.FramelessWindowHint)
pixmap = QPixmap("photos/splash.png")
self.splash_image = QLabel(self)
self.splash_image.setPixmap(pixmap.scaled(350, 300))
self.pbar = QProgressBar(self)
self.pbar.setValue(0)
vbox = QVBoxLayout()
vbox.addWidget(self.splash_image)
vbox.addWidget(self.pbar)
self.setLayout(vbox)
progress = ThreadProgress(self)
progress.mysignal.connect(self.progress)
progress.start()
@pyqtSlot(int)
def progress(self, finished):
self.pbar.setValue(finished)
if finished == 100:
self.hide()
self.start_main()
def start_main(self):
from MainWindow import MainWindow
main = MainWindow(self)
main.show()
def main():
app=QApplication(sys.argv)
window = Splash()
window.show()
app.exec_()
main()
Комментарии:
1. Почему вы пытаетесь использовать QMainWindow в качестве заставки вместо использования QSplashScreen ? Кроме того, вы уже используете
super(Splash, self).__init__(parent)
, вызовQMainWindow.__init__(self)
после этого бессмыслен. Тем не менее, у него нет отдельного окна, потому что вы создаетеMainWindow
сself
помощью аргумента as, который сделает новыйMainWindow
экземпляр дочерним виджетом текущего. Вы могли бы создать экземпляр без родительского элемента и установить для него ссылку (self.main = ...
), но это было бы бессмысленно: прежде всего ->2. -> как уже было сказано, вы должны использовать QSplashScreen, тогда вам, конечно, не следует использовать виджет splash (какой бы класс вы ни решили использовать) в качестве первого и основного объекта в вашей программе. Вероятно, это должен быть отдельный виджет, который создается при запуске приложения, возможно, в начале
__init__
фактического главного окна (или даже QApplication)3. Я не использовал QSplashScreen, потому что в Python не было полезной документации для него. Однако использование
self.main = ....
вместоMainWindow(self)
просто решило мою проблему, если вы, пожалуйста, опубликуете его в качестве ответа, я проверю его как правильный. Спасибо4. Я настоятельно рекомендую избегать использования другого класса для заставки, особенно QMainWindow. Я знаю, что иногда документация может быть плохой или скудной для пользователей PyQt, но это не должно приводить к использованию неправильных классов: QMainWindow не предназначен для этого (вы должны по крайней мере использовать QWidget) и имеет функции, которые потенциально могут стать ошибками. Извините, но я не буду публиковать ответ на то, что я считаю неправильным, вводящим в заблуждение или даже вредным, и есть много ответов о создании нового окна, которые слишком похожи на ваши, и новый ответ не добавит ничего полезного.
5. Вместо этого я бы посоветовал вам внимательно прочитать его документацию (ссылка выше; как и все официальные документы Qt, они ориентированы на C , но их функции одинаковы для Qt в 99% случаев, и вы также можете поискать документы, ориентированные на PySide ) и провести некоторые исследования даже здесь, в StackOverflow(или простой «site:stackoverflow.com pyqt qsplashscreen» в Google, если хотите), так как есть множество связанных с этим вопросов, которые могут дать вам много подсказок по его использованию.