在pyQt中制作一个看不见的层,覆盖整个透明框

时间:2018-09-13 11:47:37

标签: python pyqt pyqt5

我想在pyqt5应用程序中执行任务时显示微调框。我找到了一个很好的微调器实现,所以我尝试了它:https://github.com/z3ntu/QtWaitingSpinner

该演示正常,但在演示中,微调框显示在对话框的空白区域。我希望它可以覆盖整个对话框。

QtWaitingSpinner的作者建议:“作为另一个示例,下面的代码将创建一个微调器,该微调器(1)只要微调器处于活动状态,就会阻止所有用户对主应用程序的输入,(2)自动将其居中每次调用“开始”时,其父窗口小部件就会出现;(3)使用默认的形状,大小和颜色设置。”使用以下代码:

spinner = QtWaitingSpinner(self, True, True, Qt.ApplicationModal)
spinner.start() # starts spinning

但是我以该实现为例,但没有成功:

from PyQt5.QtWidgets import QApplication, QDialog, QTabWidget, QWidget, QGroupBox, QPushButton, QVBoxLayout
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
import requests
import urllib
from waitingspinnerwidget import QtWaitingSpinner

class DownloadDataDialog(QDialog):
    def __init__(self, parent=None):
        super(DownloadDataDialog, self).__init__(parent)

        self.spinner = QtWaitingSpinner(self, True, True, Qt.ApplicationModal)

        tabWidget = QTabWidget(self)
        tabWidget.addTab(MyTab(tabWidget), "MyTab")

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(tabWidget)
        self.setLayout(mainLayout)

        self.setWindowTitle("Download option chain data from web")

class MyTab(QWidget):
    def __init__(self, parent=None):
        super(MyTab, self).__init__(parent)

        dataGroup = QGroupBox('Data')

        getButton = QPushButton('Download')
        getButton.clicked.connect(self.download_data)

        dataLayout = QVBoxLayout()
        dataLayout.addWidget(getButton)
        dataGroup.setLayout(dataLayout)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(dataGroup)
        mainLayout.addStretch(1)
        self.setLayout(mainLayout)

    def download_data(self):
        self.parent().parent().parent().spinner.start()
        url = 'http://www.meff.es/docs/Ficheros/Descarga/dRV/RV180912.zip'
        filepath = None
        try:
            filepath = self.download_data_file(url)
        except Exception as e:
            print(e)

        self.parent().parent().parent().spinner.stop()
        if filepath:
            #TODO doing stuff here
            self.parent().parent().parent().close()
        else:
            pass #TODO show error dialog

    def download_data_file(self, download_url):           
        # Build request URL and download the file
        destination = 'test.zip'
        urllib.request.urlretrieve(download_url, destination)
        return destination

if __name__ == '__main__':

    import sys

    app = QApplication(sys.argv)

    tabdialog = DownloadDataDialog()
    tabdialog.show()
    sys.exit(app.exec_())

所以我的目的是创建一个不可见的层,将微调器设置为其唯一的小部件,并在整个对话框窗口中显示半透明层。

关于我该怎么做的任何想法?

0 个答案:

没有答案