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

2023-12-28

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

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).

我希望这有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • “.”在哪里? (点)来自使用 PHP 'scandir' 时

    我有点困惑 我正在构建一个 PHP 函数来循环输出指定目录中的图像 PHP dir bilder objekt 0 objekt nr thumbnail thumbnails scandir dir print r thumbnails
  • 如何在生成 PDF 文件下载时显示进度条,而不出现 IE“下载”警告

    我已经在客户端和服务器之间进行了通信 过程很简单 我正在向控制器发出 AJAX POST 请求 该控制器在文件系统中生成 pdf 上述请求成功后 将发出表单 GET 请求以取回 pdf 并打开标准浏览器 保存或打开 对话框 我之所以采用两步
  • C - fwrite 大于 4GB 的二进制文件

    我基本上是 C 新手 我有一个 64 位 Windows 7 配备 64GB RAM 和 240GB SSD 我使用的采集板将采集的数据存储在 2 个内部 FIFO 中 然后将数据传递到 RAM 这样我就有可能采集 60 GB 的数据 我无
  • 部署时字体未加载

    我创建了一个有角度的应用程序 它在本地环境中加载得非常好 所有样式和字体都被应用 但是当我部署它时 字体没有加载 无法弄清楚为什么 它没有在控制台中显示任何错误或警告消息 我正在导入所有 css 样式angular json文件如下 dem
  • Factorial 函数在 Python 中工作,对于 Julia 返回 0

    我在Python中定义了一个阶乘函数 如下所示 def fact n if n 1 return n else return n fact n 1 print fact 100 在 Julia 中如下 function fact n if
  • 更改日期格式javascript

    我正在从两个不同的 API 中提取一些数据 稍后我想要获取这些对象 但是 我得到两种不同的日期格式 这种格式 1427457730 和这种格式 2015 04 10T09 12 22Z 如何更改其中之一的格式 以便我可以使用相同的格式 ea
  • MSSQLSM 2008 奇怪的登录在 select 语句上失败

    我的SQL服务器上有多种用户 所有用户都可以登录服务器 然而 一个用户一旦登录就无法在特定视图上运行任何操作 选择 更改 编辑 但可以在所有其余视图上运行 用户设置与具有完全访问权限的另一个帐户相同 说实话 它们是相同的 对于无法从他的视图
  • Apollo 的 MockedProvider 不为 withApollo 中包装的组件提供客户端

    在测试 withApollo 中包装的组件时 我使用 Apollo 文档中指定的 Apollo 的 MockedProvider 但是当酶尝试渲染该组件时 渲染器找不到clientMockedProvider 应该已经提供了 我有一个使用的
  • 如何使用jquery检查某个元素是否在用户视图中

    我有一个很大的可拖动对象div在我的窗户里 这div有一个较小的窗口 div style width 500px height 500px div style width 100 height 5000px ul li li li li l
  • WCF netTCPBinding - 传输加密是否足够?

    我有一个处理一些敏感数据的 WCF 服务 我想确保不暴露这些数据 所以我正在考虑 netTCPBinding 主要是因为我可以控制它运行的网络 并且性能是重中之重 我认识到有两个领域可以加密 传输级别和消息级别 我打算使用证书在传输级别进行
  • 获取每个字符出现的次数

    给定字符串 a dqdwqfwqfggqwq 如何获取每个字符出现的次数 在2 7和3 1中有一个叫做Counter的工具 gt gt gt import collections gt gt gt results collections C
  • Winform 消息框中可点击的 URL?

    我想在消息框中显示帮助链接 默认情况下 文本显示为不可选择的字符串 一种选择是在消息框中显示 url 以及一条消息 并提供帮助按钮 将您带到该 url MessageBox Show test message caption Message
  • 如何使用 CSS 将跨度更改为看起来像 pre?

    是否可以更改 span 标签 或 div 将其内容预格式化为 pre 标签只使用 CSS 吗 看着那 这W3C CSS2 1 默认样式表 https www w3 org TR CSS21 sample html or the CSS2 2
  • AJAX向WebApi传递多个参数

    AJAX 请求 ajax url url dataType json type Post data token 4 feed id 0 message Hello World userId 4 服务器端 Web API HttpPost p
  • 使用外部框架构建 Objective-C 应用程序

    我正在整合growl http growl info documentation developer implementing growl php lang cocoa进入我的 Objective C 应用程序 但是 如果我构建并运行我的应
  • C、硬件抽象层中“extern”类型的变量

    我正在研究硬件抽象层 该 HAL 的目的是在 Linux 驱动程序和 MCU 驱动程序之间轻松切换 我正在研究SPI接口 下面是 打开 SPI接口的HAL函数的签名 哈尔 spi h spi handle t spi open spi po
  • 将多个通用接口传递给一个方法

    我试图将多个通用接口作为参数传递给我的类之一的构造函数 以下代码无法编译 public interface IPosterGenerator
  • 如何使用Gradle将Android配置注入到每个子项目中?

    而不是在每个子项目中复制 android 配置块 android compileSdkVersion 19 buildToolsVersion 19 0 0 defaultConfig minSdkVersion 9 targetSdkVe
  • 为什么使用“set var = value”获取脚本会破坏 $@?

    我正在尝试在 Centos 虚拟机上配置自动注销 我注意到 如果我在 etc profile d autologout sh 创建一个文件 仅set autologout 30在文件中 然后它会中断为任何源自 etc profile 的脚本
  • 如何通过拖动来调整 PyQt 小部件的大小?

    我有一个 QScrollArea 其中包含一个带有 QVBoxLayout 的小部件 该布局内还有其他几个小部件 我希望用户能够拖动这些小部件的下边框以在垂直方向上调整它们的大小 当它们调整大小时 我不希望它们从滚动区域中的其他小部件 窃取