Как я могу изменить QtableWidget, который находится на QMainWindow из метода QGraphicsView? - PullRequest
0 голосов
/ 29 марта 2020

По существу, я создал QMainWindow, у которого есть Splitter, который, в свою очередь, имеет на левой стороне QTableWidget, а на правой стороне QGraphicsView.

Я также создал метод для увеличения и уменьшения масштаба. QGraphicsView. Теперь я хочу изменить высоту строк в зависимости от величины увеличения, предоставленной пользователем.

    class MyWindow(QMainWindow):

    def __init__(self):
        super(MyWindow, self).__init__()

        # Main characteristics of the window
        self.setGeometry(50, 50, 1000, 700)

        #User Interface
        self.initUI()

    def initUI(self):

        #Creation of table and timeline splitter
        self.table_and_view_splitter = QtWidgets.QSplitter()
        self.table_and_view_splitter.setOrientation(QtCore.Qt.Horizontal)

            #Creation of metadata table
        self.create_table()
        self.table_and_view_splitter.addWidget(self.table)

            #Creation of View and Scene for timeline
        self.create_view()
        self.table_and_view_splitter.addWidget(self.view)

        # Creation of vertical splitter

        self.vertical_splitter = QtWidgets.QSplitter()
        self.vertical_splitter.setOrientation(QtCore.Qt.Vertical)
        self.vertical_splitter.insertWidget(1, self.table_and_view_splitter)

        # Choosing the sizes of the upper and lower widgets of the Qsplitter
        self.sizes_list = [100, 5000]
        self.vertical_splitter.setSizes(self.sizes_list)

        self.setCentralWidget(self.vertical_splitter)

    def create_table(self):

        self.table = QTableWidget()
        self.table.setColumnCount(3)
        self.table.setRowCount(100)

        for i in range(self.table.rowCount()):
            self.table.setRowHeight(i, 10)

    def create_view(self):
        self.view = viewFor()
        self.scene = QtWidgets.QGraphicsScene()
        self.scene.addEllipse(1, 1, 10, 10)
        self.view.setScene(self.scene)

class viewFor(QGraphicsView):

    def __init__(self):
        super(viewFor, self).__init__()

        self.drag = False
        self.setTransformationAnchor(self.NoAnchor)

    def wheelEvent(self, event):

        self.setTransformationAnchor(self.AnchorUnderMouse)

        zoom_in_factor = 1.1
        zoom_out_factor = 1 / zoom_in_factor

        # Save the scene pos
        old_position = self.mapToScene(event.pos())

        if QApplication.keyboardModifiers() == Qt.ControlModifier:# CTRL + Scroll -> X and Y Zoom
            # Zoom
            if event.angleDelta().y() > 0:
                zoom_factor = zoom_in_factor
            else:
                zoom_factor = zoom_out_factor
            self.scale(zoom_factor, zoom_factor)
            #HERE I WANT TO RESIZE THE ROWS HEIGHT ACCORDING TO THE zoom_factor

            # Get the new position
            new_position = self.mapToScene(event.pos())

            # Move scene to old position
            delta = new_position - old_position
            self.translate(delta.x(), delta.y())

        else:# Only Scroll -> only X Zoom
            # Zoom
            if event.angleDelta().y() > 0:
                zoom_factor = zoom_in_factor
            else:
                zoom_factor = zoom_out_factor
            self.scale(zoom_factor, 1)

            # Get the new position
            new_position = self.mapToScene(event.pos())

            # Move scene to old position
            delta = new_position - old_position
            self.translate(delta.x(), delta.y())

app = QApplication([])
foo = MyWindow()
foo.show()
sys.exit(app.exec_())

1 Ответ

0 голосов
/ 29 марта 2020

Вам необходимо подавать сигнал всякий раз, когда изменяется масштаб, и QHeaderView.setDefaultSectionSize() для вертикального заголовка. Обратите внимание, что вам, вероятно, следует использовать setSectionResizeMode(QHeaderView.Fixed), чтобы избежать изменения размера пользователя (или просто оставить его на Interactive, но, конечно, не используйте Stretch или ResizeToContents).

Очевидно, вы должны убедиться, что диапазон действителен, или найти свой собственный алгоритм (который очищает значение до допустимого диапазона, который имеет минимум 1).
В этом случае я использовал исходное значение по умолчанию и умножил его, используя масштабный коэффициент преобразования вида (см. QTransform> рендеринг графики о значении матрицы преобразования).

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()

        # Main characteristics of the window
        self.setGeometry(50, 50, 1000, 700)

        #User Interface
        self.initUI()
        self.view.scaleChanged.connect(self.resizeRows)
        self.defaultSize = self.table.verticalHeader().defaultSectionSize()

    def resizeRows(self, scale):
        self.table.verticalHeader().setDefaultSectionSize(scale * self.defaultSize)


class viewFor(QtWidgets.QGraphicsView):
    scaleChanged = QtCore.pyqtSignal(float)

    # ...

    def wheelEvent(self, event):

        self.setTransformationAnchor(self.AnchorUnderMouse)

        zoom_in_factor = 1.1
        zoom_out_factor = 1 / zoom_in_factor

        # Save the scene pos
        old_position = self.mapToScene(event.pos())

        if event.modifiers() == QtCore.Qt.ControlModifier:# CTRL + Scroll -> X and Y Zoom
            # Zoom
            if event.angleDelta().y() > 0:
                zoom_factor = zoom_in_factor
            else:
                zoom_factor = zoom_out_factor
            self.scale(zoom_factor, zoom_factor)

            # emit the signal based on the transformation scale factor
            self.scaleChanged.emit(self.transform().m11())
            # ...

Обратите внимание, что вам не нужно использовать QApplication.keyboardModifiers, так как Вы можете получить доступ к modifiers() всех событий клавиатуры / мыши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...