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