Как я могу остановить создание QSvgWidget своего собственного окна - PullRequest
1 голос
/ 11 июня 2019

Я только что разработал способ отображения изображения svg в pyqt5 с помощью QSvgWidget и попытался перенести его в пустой графический интерфейс, созданный с помощью дизайнера qt. Изображение svg отображается, но в собственном окне, а не в контейнере или на границе.

Я пытался прочитать документы QSvgWidget, чтобы увидеть, что я делаю неправильно, но у меня такое чувство, что это проблема с использованием PyQT5, а не QSvgWidget.

from PyQt5 import QtCore, QtGui, QtWidgets, QtSvg
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.viewer = QtSvg.QSvgWidget()
        self.viewer.load('C:/Windows/Temp/tubesheetsvgpreview.svg')
        self.viewer.setGeometry(QtCore.QRect(0,0,600,600))
        self.viewer.show()

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))




if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Результаты выглядят так:

enter image description here

тогда как я просто хотел бы, чтобы svg появлялся на границе внутри главного окна и масштабировался до границы или размера окна

1 Ответ

1 голос
/ 11 июня 2019

Чтобы виджет был частью окна, он должен быть дочерним элементом окна или дочерним элементом дочернего элемента окна, в случае QMainWindow он должен быть от centralWidget, для этого есть 2 метода:

  1. Пройдите к окну как родитель.
# ...
# pass self.centralwidget as parent
self.viewer = QtSvg.QSvgWidget(self.centralwidget) 
self.viewer.load('C:/Windows/Temp/tubesheetsvgpreview.svg')
self.viewer.setGeometry(QtCore.QRect(0,0,600,600))
# ...
  1. Установите виджет через макет.
# ...
self.centralwidget.setObjectName("centralwidget")

self.viewer = QtSvg.QSvgWidget()
self.viewer.load('C:/Windows/Temp/tubesheetsvgpreview.svg')
self.viewer.setGeometry(QtCore.QRect(0,0,600,600))

# set the layout to centralWidget
lay = QtWidgets.QVBoxLayout(self.centralwidget)
# add the viewer to the layout
lay.addWidget(self.viewer)

MainWindow.setCentralWidget(self.centralwidget)
# ...

Обновление:

Если вы хотите центрировать виджет, лучше использовать второй метод и установить выравнивание:

# ...
lay = QtWidgets.QVBoxLayout(self.centralwidget)
lay.addWidget(self.viewer, alignment=QtCore.Qt.AlignCenter) # <---
# ... 

В случае первого метода переместите официальный виджет (и, по сути, это то, что делает макет в другом методе), но вам придется делать то же самое каждый раз, когда виджет изменяется в размере.

Итак, самый простой способ - использовать макет.

...