Как я могу сделать виджет PyQt изменяемым с помощью перетаскивания?
У меня есть QScrollArea, содержащий виджет с QVBoxLayout. Внутри этого макета есть несколько других виджетов. Я хочу, чтобы пользователь мог перетаскивать нижние границы этих виджетов, чтобы изменять их размеры в вертикальном направлении. Когда они меняются, я не хочу, чтобы они "крали" размер у других виджетов в области прокрутки; вместо этого я хочу, чтобы вся прокручиваемая "страница" изменила свой размер. Поэтому, если вы увеличите один из виджетов, он должен сдвинуть другие виджеты вниз (из области просмотра области прокрутки); если вы уменьшите его, он должен подтянуть другие виджеты вверх. Перетаскивание границы одного виджета не должно изменять размер любого другого виджета в вертикальной прокрутке; это должно просто переместить их.
Я начал с использования QSplitter. Если я использую это, я могу перетащить, чтобы изменить размер виджета, но, похоже, нет способа заставить его "толкать / тянуть" другие, как я описал выше, вместо того, чтобы увеличивать / уменьшать их. Но я не могу найти другого способа дать виджету перетаскиваемый дескриптор, который позволит мне изменить его размер. Как я могу сделать это?
Вот простой пример того, что я делаю. (В этом примере я закомментировал сплиттер, но если вы раскомментируете его, вы увидите, что происходит с этой версией.)
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.Qsci import QsciScintilla, QsciLexerPython
class SimplePythonEditor(QsciScintilla):
def __init__(self, parent=None):
super(SimplePythonEditor, self).__init__(parent)
self.setMinimumHeight(50)
class Chunk(QFrame):
def __init__(self, parent=None):
super(Chunk, self).__init__(parent)
layout = QVBoxLayout(self)
sash = QSplitter(self)
layout.addWidget(sash)
sash.setOrientation(Qt.Vertical)
editor = self.editor = SimplePythonEditor()
output = self.output = SimplePythonEditor()
output.setReadOnly(True)
sash.addWidget(editor)
sash.addWidget(output)
self.setLayout(layout)
print(self.sizePolicy())
class Widget(QWidget):
def __init__(self, parent= None):
global inout
super(Widget, self).__init__()
#Container Widget
widget = QWidget()
#Layout of Container Widget
layout = QVBoxLayout(self)
#sash = QSplitter(self)
#layout.addWidget(sash)
#sash.setOrientation(Qt.Vertical)
for num in range(5):
editor = SimplePythonEditor()
editor.setText("Some stuff {}".format(num))
layout.addWidget(editor)
#sash.addWidget(editor)
widget.setLayout(layout)
#Scroll Area Properties
scroll = QScrollArea()
scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
scroll.setWidgetResizable(True)
scroll.setWidget(widget)
scroll.setMaximumHeight(500)
#Scroll Area Layer add
vLayout = QVBoxLayout(self)
vLayout.addWidget(scroll)
self.setLayout(vLayout)
if __name__ == '__main__':
app = QApplication(sys.argv)
dialog = Widget()
dialog.show()
app.exec_()
0 ответов
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setWindowTitle("MainWindow")
MainWindow.resize(500, 500)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
QMetaObject.connectSlotsByName(MainWindow)
class Ewindow(QMainWindow,QApplication):
"""docstring for App"""
resized = pyqtSignal()
def __init__(self,parent):
super(Ewindow,self).__init__(parent=parent)
self.setGeometry(500, 500, 800,800)
self.setWindowTitle('Mocker')
self.setWindowIcon(QIcon('icon.png'))
self.setAttribute(Qt.WA_DeleteOnClose)
ui2 = Ui_MainWindow()
ui2.setupUi(self)
self.resized.connect(self.readjust)
def resizeEvent(self, event):
self.resized.emit()
return super(Ewindow, self).resizeEvent(event)
def readjust(self):
self.examForm.move(self.width()-self.examForm.width(),0)
self.btn_skip.move(self.width()-self.btn_skip.width(),self.height()-100)
self.btn_next.move(self.btn_showAnswers.x()+self.btn_showAnswers.width(),self.height()-100)
self.btn_prev.move(0,self.height()-100)
self.btn_showAnswers.move(self.btn_prev.x()+self.btn_prev.width(),self.height()-100)
self.btn_home.move(self.width()-200,self.height()-150)
self.lbscreen1.resize(self.width()-self.examForm.width(),self.height()-200)
self.examForm.resize(200,self.height()-150)
self.btn_skip.resize(self.examForm.width(),100)
self.btn_next.resize(self.btn_prev.width(),100)
self.btn_prev.resize(self.width()*0.25,100)
self.btn_showAnswers.resize(self.btn_prev.width(),100)
self.btn_home.resize(200,50)
вот пример кода окна изменяемого размера, которое он перемещает и растягивает виджеты при изменении размера окна. Идея состоит в том, чтобы сохранить координаты и размеры виджета относительно друг друга.
так что мне пришлось сделать class Ui_MainWindow
и установите его для моего класса окна ui2.setupUi(self)
а также объявить resized = pyqtSignal()
который я бы использовал для запуска функции перенастройки, которая сбрасывает размер и координаты виджетов, например self.resized.connect(self.readjust)
.
надеюсь, это поможет!