如何通过拖动来调整PyQt小部件的大小?

时间:2016-05-12 19:31:51

标签: python qt resize pyqt qscrollarea

我有一个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_()

1 个答案:

答案 0 :(得分: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)运行readjust函数来重置大小和像import boto3 sqs = boto3.client('sqs', aws_access_key_id='<aws-id>', aws_secret_access_key='<aws-key>', region_name='<aws-region>' ) queue_url = '<aws-queue-url' # Long poll for message on provided SQS queue response = sqs.receive_message( QueueUrl=queue_url, MaxNumberOfMessages=1, MessageAttributeNames=[ 'Messages' ], WaitTimeSeconds=20 ) 这样的小部件的坐标。

我希望这会有所帮助!