Как я могу расположить эти элементы (и будущие элементы) по своему усмотрению, без "привязки" к макету? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть созданный графический интерфейс в PyQt5. У меня есть 1 текущий виджет и другие, которые скоро появятся, и я хочу добавить его в свой графический интерфейс. Тем не менее, я не могу найти способ выставить их, как я хочу. Я использую такие вещи, как макеты сетки, но они допускают только «заблокированные» места, т.е. (0,1) (1,0) (1,1), я не думаю, что они позволяют вам просто использовать такие вещи, как move () для расположите элементы.

Я уже пробовал, как уже упоминалось, QGridLayout, QHBoxLayout и QVBoxLayout. Я также пробовал группы.

import sys
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Settings():
    SCENE_SIZE_X = 1200
    SCENE_SIZE_Y = 900
    GRID_COUNT_X = 4
    GRID_COUNT_Y = 5
    GRID_BOX_WIDTH = 100
    GRID_BOX_HEIGHT = 100

class Grid(QtWidgets.QGraphicsScene):

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

        self.lines = []
        self.scrolled = 0
        self.initUI()

    def initUI(self):
        self.draw_grid(Settings.GRID_COUNT_X, Settings.GRID_COUNT_Y, Settings.GRID_BOX_WIDTH, Settings.GRID_BOX_HEIGHT)
        self.set_opacity(1.0)

    def draw_grid(self, x_count, y_count, x_size, y_size):
        width = x_count * x_size
        height = y_count * y_size
        self.setSceneRect(0, 0, width, height)
        self.setItemIndexMethod(QtWidgets.QGraphicsScene.NoIndex)

        pen = QPen(QColor(0,0,0), 1, Qt.SolidLine)

        for x in range(0,x_count+1):
            xc = x * x_size
            self.lines.append(self.addLine(xc,0,xc,height,pen))
            self.addText

        for y in range(0,y_count+1):
            yc = y * y_size
            self.lines.append(self.addLine(0,yc,width,yc,pen))

    def set_opacity(self,opacity):
        for line in self.lines:
            line.setOpacity(opacity)

    def delete_grid(self):
        for line in self.lines:
            self.removeItem(line)
        del self.lines[:]

    def wheelEvent(self,event):
        self.scrolled += event.delta()/90
        if(self.scrolled > -30.0):
            self.delete_grid()
            self.draw_grid(Settings.GRID_COUNT_X, Settings.GRID_COUNT_Y, Settings.GRID_BOX_WIDTH + self.scrolled, Settings.GRID_BOX_HEIGHT + self.scrolled)
        else:
            self.scrolled = -30.0

class App(QtWidgets.QDialog):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 100, Settings.SCENE_SIZE_X, Settings.SCENE_SIZE_Y)

        grid = QtWidgets.QGraphicsView(Grid())

        layout = QGridLayout(self)
        layout.addWidget(grid, 0, 1)
        layout.addWidget(QtWidgets.QPushButton("hello!"), 0, 0)
        layout.setRowStretch(2, 1)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("Fusion")
    ex = App()
    ex.show()
    sys.exit(app.exec_())

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

Как я уже говорил, я пробовал группы, и они вроде работали. Я все понял правильно, но это выглядело грязно, поскольку внутри групп, внутри групп были виджеты:

Picture of me trying groups

Каков наилучший способ разрешить мне расположить их, возможно, с точностью до одного пикселя, то есть с помощью move ()?

Спасибо, Мечта

РЕДАКТИРОВАТЬ: код и изображение не выстраиваются в линию, потому что это была старая итерация кода

...