【问题标题】:PyQt5 QgraphicsView width and heightPyQt5 QgraphicsView 宽高
【发布时间】:2021-07-09 11:56:31
【问题描述】:

文件:main.py

# -*- 编码:utf-8 -*- # 通过读取 ui 文件 'main.ui' 生成的表单实现 # # 创建者:PyQt5 UI 代码生成器 5.15.2 # # 警告:当 pyuic5 被安装时,对该文件所做的任何手动更改都将丢失 # 再次运行。除非您知道自己在做什么,否则不要编辑此文件。 从 PyQt5 导入 QtCore、QtGui、QtWidgets 类 Ui_MainWindow(对象): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setSpacing(0) self.gridLayout.setObjectName("gridLayout") self.scrollArea = QtWidgets.QScrollArea(self.centralwidget) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 798, 598)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.gridLayout_2 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents) self.gridLayout_2.setContentsMargins(0, 0, 0, 0) self.gridLayout_2.setSpacing(0) self.gridLayout_2.setObjectName("gridLayout_2") self.graphicsView = QtWidgets.QGraphicsView(self.scrollAreaWidgetContents) self.graphicsView.setMinimumSize(QtCore.QSize(0, 0)) self.graphicsView.setObjectName("graphicsView") self.gridLayout_2.addWidget(self.graphicsView, 0, 0, 1, 1) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.gridLayout.addWidget(self.scrollArea, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 如果 __name__ == "__main__": 导入系统 应用程序 = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(主窗口) MainWindow.show() sys.exit(app.exec_())

文件:run_me.py

从 PyQt5 导入 QtCore、QtGui、QtWidgets 从 PyQt5.QtCore 导入 Qt 从主导入 Ui_MainWindow 作为 Ui_MainWindow 导入系统 类 Main_Code: def __init__(self): self.app = QtWidgets.QApplication(sys.argv) self.MainWindow = QtWidgets.QMainWindow() self.ui = Ui_MainWindow() self.ui.setupUi(self.MainWindow) self.MainWindow.showMaximized() self.set_input_data() self.set_view_variables() self.print_lines() sys.exit(self.app.exec_()) def set_input_data(self): self.schedule_items = [] self.schedule_items.append({"title":"计划项目 1 的标题","duration milliseconds":1000*51}) self.schedule_items.append({"title":"计划项目 2 的标题","duration 毫秒":1000*120}) self.schedule_items.append({"title":"计划项目 3 的标题","duration 毫秒":1000*500}) self.live_duration = 1000*60*60*2.5 #2小时30分钟 def set_view_variables(self): self.header_timeline_height = 40 self.schedule_items_height_spacing = 50 self.schedule_item_timeline_height = 40 self.schedule_item_movable_height = 120 #get QGraphicsView 尺寸 self.ui.graphicsView.setAlignment(Qt.AlignTop | Qt.AlignLeft) self.available_width = self.ui.graphicsView.width() self.available_height = self.ui.graphicsView.height() self.ui.graphicsView.resize(self.available_width, self.available_height) def print_lines(self): #打印时间线(顶部) self.MainWindow.setStyleSheet("背景色:黑色;") self.ui.graphicsView.setStyleSheet("背景色:黄色;") self.scene = QtWidgets.QGraphicsScene() self.scene.setBackgroundBrush(QtGui.QBrush(Qt.red)) self.ui.graphicsView.setScene(self.scene) self.ui.graphicsView.setSceneRect(0,0,self.available_width,self.available_height) self.timeline_line_top = QtWidgets.QGraphicsLineItem(0,self.MainWindow.height(),self.available_width,0) self.scene.addItem(self.timeline_line_top) 程序 = Main_Code()

我正在尝试从左下角到右上角画一条线。

使用上面的代码,输出是:

我认为这可能是一个规模问题(变量 self.available_width,self.available_height)。

我做错了什么?

【问题讨论】:

    标签: python pyqt5 qgraphicsview qgraphicsscene


    【解决方案1】:

    调整大小(和许多其他几何属性)不会同步更新,而是将标志(例如最大化)或所需大小(使用 resize() 方法)发送到操作系统(通过库)以修改现有窗口,然后操作系统实现它并返回应用更改后获得的值。因此,不建议立即进行计算,而是延迟计算:

    from PyQt5 import QtCore, QtGui, QtWidgets
    from main import Ui_MainWindow as Ui_MainWindow
    
    import sys
    
    
    class Main_Code:
        def __init__(self):
            self.app = QtWidgets.QApplication(sys.argv)
            self.MainWindow = QtWidgets.QMainWindow()
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self.MainWindow)
            self.MainWindow.showMaximized()
    
            self.init_ui()
    
            sys.exit(self.app.exec_())
    
        def init_ui(self):
            self.ui.graphicsView.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft)
    
            self.MainWindow.setStyleSheet("background-color: black;")
            self.ui.graphicsView.setStyleSheet("background-color: yellow;")
            self.scene = QtWidgets.QGraphicsScene()
            self.scene.setBackgroundBrush(QtGui.QBrush(QtCore.Qt.red))
            self.ui.graphicsView.setScene(self.scene)
    
            QtCore.QTimer.singleShot(100, self.draw_line)
    
        def draw_line(self):
            r = self.ui.graphicsView.mapToScene(
                self.ui.graphicsView.viewport().rect()
            ).boundingRect()
            self.timeline_line_top = QtWidgets.QGraphicsLineItem(
                QtCore.QLineF(r.bottomLeft(), r.topRight())
            )
            self.scene.addItem(self.timeline_line_top)
    
    
    program = Main_Code()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2017-11-26
      • 2019-09-05
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多