在qt中移除顶部的gui

时间:2013-06-10 02:49:00

标签: python qt pyqt qt-designer

在qt设计器(最好)或python中,有没有办法删除标准的Windows顶部栏并用我自己的替换它,或至少格式化它。这类似于新版本的photoshop,maya,3ds max,chrome等等。

我发现这两篇文章但除了使用C ++之外,我需要在python中工作,它们从未得到解决。

http://qt-project.org/forums/viewthread/3331/ http://qt-project.org/forums/viewthread/3847/

我从中得到的是FramelessWindowHint,它可以实现我想要的功能,但正如他们在文章中提到的那样,它消除了很多Windows功能,例如调整大小。有没有办法手动重新引入转角拖动和调整大小/关闭选项?

更具体地说,我已经在qt设计器中设计了程序并使用pyuic4来制作我的python文件。这是我加载gui的主要功能:

global globalMoAnWindow
app = QtGui.QApplication(sys.argv)
app.setStyle(QtGui.QStyleFactory.create('plastique'))
globalMoAnWindow = MoAnWin()
globalMoAnWindow.setWindowFlags(QtCore.Qt.FramelessWindowHint)
globalMoAnWindow.showMaximized()
sys.exit(app.exec_())

对于任何想要使用python并拖动小部件的人,我找到了这段代码:

def mousePressEvent(self, event):
    if event.button() == QtCore.Qt.LeftButton:
        self.dragPosition = event.globalPos() - self.frameGeometry().topLeft()
        event.accept()

def mouseMoveEvent(self, event):
    if event.buttons() == QtCore.Qt.LeftButton:
        self.move(event.globalPos() - self.dragPosition)
        event.accept()

我放入了处理主窗口的课程

1 个答案:

答案 0 :(得分:4)

您可以使用QSizeGrip向窗口添加调整大小控件。它们的行为与系统行为完全相同您应该创建一个布局并将QSizeGrip放到窗口的每个角落。

widget = QWidget()
widget.setWindowFlags(Qt.FramelessWindowHint)
layout = QGridLayout(widget)
layout.setContentsMargins(0, 0, 0, 0)
sizeGrip1 = QSizeGrip(widget)
sizeGrip2 = QSizeGrip(widget)
sizeGrip3 = QSizeGrip(widget)
sizeGrip4 = QSizeGrip(widget)
layout.addWidget(sizeGrip1, 0, 0)
layout.addWidget(sizeGrip2, 0, 2)
layout.addWidget(sizeGrip3, 2, 2)
layout.addWidget(sizeGrip4, 2, 0)
label = QLabel("Contents")
layout.addWidget(label, 1, 1)

widget.show()

QMainWindow的变化:

window = QMainWindow()
widget = QWidget()
window.setCentralWidget(widget)
window.setWindowFlags(Qt.FramelessWindowHint)
layout = QGridLayout(widget)
#...
window.show()

实现关闭按钮很简单。只需在布局中添加QPushButton或QToolButton,然后在其onclick处理程序中调用QWidget::close

拖动更复杂,因为没有标准小部件可以执行此操作。 this answer中描述了一种解决方案。