如何为这个基于PySide的UI添加状态

1 投票
2 回答
521 浏览
提问于 2025-04-18 02:57

看看这段代码

import sys
from PySide import QtCore, QtGui


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

        self.quit = QtGui.QPushButton("Quit", self)
        self.setGeometry(300, 300, 250, 150)
        self.statusBar().showMessage('Ready')


app = QtGui.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())

现在我想做的就是添加一个状态栏。状态栏在QtGui.QMainWindow中是可以用的。那我该怎么利用这个来在上面的程序中添加状态栏呢?在pyside编程中,似乎每个组件都需要创建一个类,并且有些要连接到主类……这里面有什么理论呢?

我自己尝试过这样做,但没有成功。

import sys
from PySide import QtCore, QtGui


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

        self.quit = QtGui.QPushButton("Quit", self)
        self.setGeometry(300, 300, 250, 150)
        self.statusBar().showMessage('Ready')
        self.s = MyStatus()

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

        self.statusBar().showMessage('Ready')

app = QtGui.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())

2 个回答

1

如果你想要一个带状态栏的窗口,可以使用 QMainWindow:它自带状态栏(还有菜单栏、工具栏、停靠窗口等)。其他的控件没有这些内置功能,所以自然也就没有像 statusBar 这样的方法。如果你坚持不使用 QMainWindow,想要自己实现这些功能,那你就得自己添加所有这些东西。

虽然我不建议这样做,但这里有一个简单的示例,展示如何给 QWidget 添加一个状态栏:

import sys
from PySide import QtCore, QtGui

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

        self.central_widget = QtGui.QWidget(self)

        self.quit = QtGui.QPushButton("Quit", self)
        self.setGeometry(300, 300, 250, 150)

        layout = QtGui.QVBoxLayout(self.central_widget)
        layout.addWidget(self.quit)

        self.status = QtGui.QStatusBar(self)

        layout = QtGui.QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.widget)
        layout.addStretch()
        layout.addWidget(self.status)

        self.status.showMessage('Ready')

app = QtGui.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
1

你不需要为每个组件都创建一个类,但如果你想修改或覆盖每个组件自带的功能,那就需要为它创建一个类。

要在主窗口中添加一些东西,你只需要创建一个对象,然后把它加到布局里。具体做法如下:

import sys
from PySide import QtGui , QtCore

class MyStatusBar(QtGui.QStatusBar):
    def __init__(self, parent=None):
        super(MyStatusBar, self).__init__(parent)
    #Override any functions, or define new function for our status bar here

class MyMainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        #Set the size of the window
        self.setMinimumSize(300,300)
        #Create a status bar, from our OWN class
        self.status_bar = MyStatusBar(self)
        self.status_bar.setGeometry(QtCore.QRect(0, 0, 50, 50))
        self.status_bar.showMessage('Ready')
        #Add a simple quit button, from the DEFAULT class
        self.quit_button = QtGui.QPushButton(self)
        self.quit_button.clicked.connect(self.close)
        self.quit_button.setGeometry(QtCore.QRect(100, 100, 100, 35))
        self.quit_button.setText("Close")


#Start the application    
app = QtGui.QApplication(sys.argv)
top = MyMainWindow()
top.show()
app.exec_()

撰写回答