这个想法是从父窗口菜单中打开一个子窗口,当我最小化父窗口时,也必须最小化子窗口,并且只能打开一个子窗口。我有在最小化父级时最小化子级的解决方案,但是我可以多次打开子级窗口(尽管已经打开了子级),并且我想禁用多个子级窗口的打开。
父窗口是MainWindow.py:
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle('Parent window')
self.flags = QtCore.Qt.Window
self.ControlPanel = Control_panel_window()
self.createActions()
self.createMenus()
def createActions(self):
# window - menu
self.windowShowControlPanelAction = QtGui.QAction(self.tr("&Control panel"), self, statusTip='Control panel')
self.connect(self.windowShowControlPanelAction, QtCore.SIGNAL("triggered()"), self.ShowControlPanel)
def createMenus(self):
# window
self.windowMenu = QtGui.QMenu(self.tr("&Window"), self)
self.windowMenu.addAction(self.windowShowControlPanelAction)
self.menuBar().addMenu(self.windowMenu)
def ShowControlPanel(self):
self.ControlPanel = Control_panel_window(self)
self.ControlPanel.setWindowFlags(QtCore.Qt.Window)
self.ControlPanel.show()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
win = MainWindow()
win.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
win.show()
sys.exit(app.exec_())
子窗口是ChildWindow.py:
class Control_panel_window(QWidget):
def __init__(self, parent = None):
super(Control_panel_window, self).__init__(parent)
self.setFixedSize(200, 300)
def setWindowFlags(self, flags):
print "flags value in setWindowFlags"
print flags
super(Control_panel_window, self).setWindowFlags(flags)
问题是:如何设置仅打开一个子窗口?
在您的ShowControlPanel
功能中,每次触发信号时,您都将创建一个新的控制面板。既然您已经有可用的实例,为什么不使用它呢?
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle('Parent window')
self.flags = QtCore.Qt.Window
self.control_panel = ControlPanelWindow(self)
self.control_panel.setWindowFlags(self.flags)
#...
def create_actions(self):
self.show_control_panel_action = QtGui.QAction(
self.tr("&Control panel"),
self,
statusTip='Control panel'
)
self.show_control_panel_action.triggered.connect(self.show_control_panel)
#...
def show_control_panel(self):
self.control_panel.show()
一些风格注释:
CamelCase
用于类,lowercase_with_underscore
几乎用于其他所有东西。在这种情况下,由于Qt
使用halfCamelCase
的方法等,你可以用它太一致性。使用新型信号语法:
the_object.signal_name.connect(function)
代替:
self.connect(the_object, QtCore.SIGNAL('signal_name'), function)
它不仅读起来更好,而且还提供了更好的调试信息。QtCore.SIGNAL
如果信号不存在,使用,您将不会收到错误消息(例如,您写了like的错字trigered()
而不是triggered()
)。在这种情况下,新样式的语法确实会引发异常,而您无需猜测为什么某些方法无法正常工作并在整个代码库中搜索拼写错误,便可以更早地纠正错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句