PyQt-手动调整菜单小部件的大小不会调整其内容

PyQt-手动调整菜单小部件的大小不会调整其内容,qt,user-interface,pyqt,pyqt4,Qt,User Interface,Pyqt,Pyqt4,我使用QToolButton打开一个菜单,这是一个简单的QWidget。在这个小部件中有一个QTextEdit和一个按钮。在右下角有一个QSizeGrip,我想使用它让用户调整小部件的大小,从而调整qtexdit 如果我在主窗口中单独使用这个小部件(选项1),一切都会按预期工作。但是,如果我将此小部件放入菜单(选项2),我将无法再调整其大小。拖动QSizeGrip会更改菜单的大小,但不会更改小部件的大小。我已经尝试过setWindowFlags(QtCore.Qt.SubWindow)和seti

我使用QToolButton打开一个菜单,这是一个简单的QWidget。在这个小部件中有一个QTextEdit和一个按钮。在右下角有一个QSizeGrip,我想使用它让用户调整小部件的大小,从而调整qtexdit

如果我在主窗口中单独使用这个小部件(选项1),一切都会按预期工作。但是,如果我将此小部件放入菜单(选项2),我将无法再调整其大小。拖动QSizeGrip会更改菜单的大小,但不会更改小部件的大小。我已经尝试过
setWindowFlags(QtCore.Qt.SubWindow)
setizepolicy(…)
,但没有任何显著效果

我的问题是:如何使小部件(连同TextEdit)的大小可调

这是代码,下面是图片

import sys
from PyQt4 import QtGui, QtCore

class MyWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)

        self.setLayout(QtGui.QVBoxLayout())
        self.TextEdit = QtGui.QTextEdit()

        self.Button = QtGui.QPushButton("Push")

        self.UpdateWidget = QtGui.QWidget()
        self.UpdateWidget.setLayout(QtGui.QHBoxLayout())
        self.UpdateWidget.layout().addWidget(self.Button, 1)
        self.UpdateWidget.layout().addWidget(QtGui.QSizeGrip(self), 0)

        self.layout().addWidget(self.TextEdit)
        self.layout().addWidget(self.UpdateWidget)

        self.layout().setSpacing(0)
        self.layout().setContentsMargins(0,0,0,0)
        self.UpdateWidget.layout().setSpacing(4)
        self.UpdateWidget.layout().setContentsMargins(0,0,0,0)

        # This is what I already tried to make the menu resizable:
        #self.setWindowFlags(QtCore.Qt.SubWindow)
        #self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        #self.TextEdit.setWindowFlags(QtCore.Qt.SubWindow)
        #self.TextEdit.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)


class ToolBar(QtGui.QWidget):
    def __init__(self, parent=None):
        super(ToolBar, self).__init__(parent)
        self.setLayout(QtGui.QHBoxLayout())
        self.Button = QtGui.QToolButton()
        self.Button.setText("Open Text Editor")
        self.Button.setPopupMode(QtGui.QToolButton.InstantPopup)
        self.Button.setMenu(QtGui.QMenu(self.Button))
        action = QtGui.QWidgetAction(self.Button)
        action.setDefaultWidget(MyWidget())
        self.Button.menu().addAction(action)
        self.layout().addWidget(self.Button)


class App(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(App, self).__init__(parent)

        #Option 1: 
        #Use MyWidget in MainWindow. This works as expected.
        #self.central = MyWidget()

        #Option 2:
        #Use MyWidget as default widgt for a menu action. 
        #In this case MyWidget cannot be resized.
        self.central = ToolBar()

        self.setCentralWidget(self.central)


if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    thisapp = App()
    thisapp.show()
    sys.exit(app.exec_())

问题是因为
按钮。菜单
不会通知小部件大小更改

在工具栏中,您可以将自己的功能分配给
resizeEvent
,这将调整小部件的大小

您需要访问您的小部件

    self.MyW = MyWidget()
您可以分配自己的功能

    self.Button.menu().resizeEvent = self.onResize

def onResize(self, event):        
    self.MyW.resize(event.size())
完整代码:

import sys
from PyQt4 import QtGui, QtCore

class MyWidget(QtGui.QWidget):

    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)    
        self.setLayout(QtGui.QVBoxLayout())

        self.TextEdit = QtGui.QTextEdit()

        self.Button = QtGui.QPushButton("Push")

        self.UpdateWidget = QtGui.QWidget()
        self.UpdateWidget.setLayout(QtGui.QHBoxLayout())
        self.UpdateWidget.layout().addWidget(self.Button, 1)
        self.UpdateWidget.layout().addWidget(QtGui.QSizeGrip(self), 0)

        self.layout().addWidget(self.TextEdit)
        self.layout().addWidget(self.UpdateWidget)

        self.layout().setSpacing(0)
        self.layout().setContentsMargins(0,0,0,0)
        self.UpdateWidget.layout().setSpacing(4)
        self.UpdateWidget.layout().setContentsMargins(0,0,0,0)


class ToolBar(QtGui.QWidget):

    def __init__(self, parent=None):
        super(ToolBar, self).__init__(parent)
        self.setLayout(QtGui.QHBoxLayout())

        self.Button = QtGui.QToolButton()
        self.Button.setText("Open Text Editor")
        self.Button.setPopupMode(QtGui.QToolButton.InstantPopup)
        self.Button.setMenu(QtGui.QMenu(self.Button))

        self.MyW = MyWidget() # <-- here
        action = QtGui.QWidgetAction(self.Button) 
        action.setDefaultWidget(self.MyW) # <-- here

        self.Button.menu().addAction(action)
        self.layout().addWidget(self.Button)

        self.Button.menu().resizeEvent = self.onResize # <-- here

    def onResize(self, event):        # <-- here
        self.MyW.resize(event.size()) # <-- here

class App(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(App, self).__init__(parent)

        #Option 1: 
        #Use MyWidget in MainWindow. This works as expected.
        #self.central = MyWidget()

        #Option 2:
        #Use MyWidget as default widgt for a menu action. 
        #In this case MyWidget cannot be resized.
        self.central = ToolBar()

        self.setCentralWidget(self.central)


if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    thisapp = App()
    thisapp.show()
    sys.exit(app.exec_())
导入系统 从PyQt4导入QtGui、QtCore 类MyWidget(QtGui.QWidget): def uuu init uuu(self,parent=None): 超级(MyWidget,self)。\uuuuu init\uuuuuuuuu(父级) self.setLayout(QtGui.QVBoxLayout()) self.TextEdit=QtGui.QTextEdit() self.Button=QtGui.QPushButton(“推”) self.UpdateWidget=QtGui.QWidget() self.UpdateWidget.setLayout(QtGui.QHBoxLayout()) self.UpdateWidget.layout().addWidget(self.Button,1) self.UpdateWidget.layout().addWidget(QtGui.QSizeGrip(self),0) self.layout().addWidget(self.TextEdit) self.layout().addWidget(self.UpdateWidget) self.layout().setspace(0) self.layout().setContentsMargins(0,0,0,0) self.UpdateWidget.layout().setSpacing(4) self.UpdateWidget.layout().setContentsMargins(0,0,0) 类工具栏(QtGui.QWidget): def uuu init uuu(self,parent=None): 超级(工具栏,自我)。\uuuu初始化\uuuuu(父级) self.setLayout(QtGui.QHBoxLayout()) self.Button=QtGui.QToolButton() self.Button.setText(“打开文本编辑器”) self.Button.setPopupMode(QtGui.QToolButton.InstantPopup) self.Button.setMenu(QtGui.QMenu(self.Button))
self.MyW=MyWidget()#问题是因为
按钮。菜单
不会通知小部件大小更改

在工具栏中,您可以将自己的功能分配给
resizeEvent
,这将调整小部件的大小

您需要访问您的小部件

    self.MyW = MyWidget()
您可以分配自己的功能

    self.Button.menu().resizeEvent = self.onResize

def onResize(self, event):        
    self.MyW.resize(event.size())
完整代码:

import sys
from PyQt4 import QtGui, QtCore

class MyWidget(QtGui.QWidget):

    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)    
        self.setLayout(QtGui.QVBoxLayout())

        self.TextEdit = QtGui.QTextEdit()

        self.Button = QtGui.QPushButton("Push")

        self.UpdateWidget = QtGui.QWidget()
        self.UpdateWidget.setLayout(QtGui.QHBoxLayout())
        self.UpdateWidget.layout().addWidget(self.Button, 1)
        self.UpdateWidget.layout().addWidget(QtGui.QSizeGrip(self), 0)

        self.layout().addWidget(self.TextEdit)
        self.layout().addWidget(self.UpdateWidget)

        self.layout().setSpacing(0)
        self.layout().setContentsMargins(0,0,0,0)
        self.UpdateWidget.layout().setSpacing(4)
        self.UpdateWidget.layout().setContentsMargins(0,0,0,0)


class ToolBar(QtGui.QWidget):

    def __init__(self, parent=None):
        super(ToolBar, self).__init__(parent)
        self.setLayout(QtGui.QHBoxLayout())

        self.Button = QtGui.QToolButton()
        self.Button.setText("Open Text Editor")
        self.Button.setPopupMode(QtGui.QToolButton.InstantPopup)
        self.Button.setMenu(QtGui.QMenu(self.Button))

        self.MyW = MyWidget() # <-- here
        action = QtGui.QWidgetAction(self.Button) 
        action.setDefaultWidget(self.MyW) # <-- here

        self.Button.menu().addAction(action)
        self.layout().addWidget(self.Button)

        self.Button.menu().resizeEvent = self.onResize # <-- here

    def onResize(self, event):        # <-- here
        self.MyW.resize(event.size()) # <-- here

class App(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(App, self).__init__(parent)

        #Option 1: 
        #Use MyWidget in MainWindow. This works as expected.
        #self.central = MyWidget()

        #Option 2:
        #Use MyWidget as default widgt for a menu action. 
        #In this case MyWidget cannot be resized.
        self.central = ToolBar()

        self.setCentralWidget(self.central)


if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    thisapp = App()
    thisapp.show()
    sys.exit(app.exec_())
导入系统 从PyQt4导入QtGui、QtCore 类MyWidget(QtGui.QWidget): def uuu init uuu(self,parent=None): 超级(MyWidget,self)。\uuuuu init\uuuuuuuuu(父级) self.setLayout(QtGui.QVBoxLayout()) self.TextEdit=QtGui.QTextEdit() self.Button=QtGui.QPushButton(“推”) self.UpdateWidget=QtGui.QWidget() self.UpdateWidget.setLayout(QtGui.QHBoxLayout()) self.UpdateWidget.layout().addWidget(self.Button,1) self.UpdateWidget.layout().addWidget(QtGui.QSizeGrip(self),0) self.layout().addWidget(self.TextEdit) self.layout().addWidget(self.UpdateWidget) self.layout().setspace(0) self.layout().setContentsMargins(0,0,0,0) self.UpdateWidget.layout().setSpacing(4) self.UpdateWidget.layout().setContentsMargins(0,0,0) 类工具栏(QtGui.QWidget): def uuu init uuu(self,parent=None): 超级(工具栏,自我)。\uuuu初始化\uuuuu(父级) self.setLayout(QtGui.QHBoxLayout()) self.Button=QtGui.QToolButton() self.Button.setText(“打开文本编辑器”) self.Button.setPopupMode(QtGui.QToolButton.InstantPopup) self.Button.setMenu(QtGui.QMenu(self.Button)) self.MyW=MyWidget()#