Создайте новое отдельное окно для основной программы

#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, если хотите), так как есть множество связанных с этим вопросов, которые могут дать вам много подсказок по его использованию.