python - 在QMainWindow中放置一个小部件,如何定位而不是setCentralWidget
问题描述
我正在使用 QGridLayout,并且通过使用 setCentralWidget 函数,行和列 (0,0) 从窗口的中心开始,这会留下很多空白空间。
我怎样才能让它居中,但从窗口顶部而不是中间开始?
我对 Qt 很陌生,想知道我是否处理错了?我应该改为为 QWidget 创建一个新类吗?
class App(QMainWindow):
def __init__(self):
super().__init__()
self.title = 'Data visualizing'
self.left = 50
self.top = 50
self.width = 300
self.height = 100
self.initUI()
def initUI(self):
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
# Create textbox
self.textbox = QLineEdit(self)
self.textbox.setReadOnly(True)
# Create textbox 2
self.textbox2 = QLineEdit(self)
self.textbox2.setReadOnly(True)
# Create button
self.button = QPushButton('Load file 1', self)
self.button.setToolTip('Click here to browse for the first data file')
self.button.clicked.connect(self.on_click)
# Create button 2
self.button2 = QPushButton('Load file 2', self)
self.button2.setToolTip('Click here to browse for the first data file')
self.button2.clicked.connect(self.on_click)
grid = QGridLayout()
grid.addWidget(self.textbox, 0, 0, 0, 3)
grid.addWidget(self.textbox2, 0, 3, 0, 3)
grid.addWidget(self.button, 1, 1, 1, 1)
grid.addWidget(self.button2, 1, 4, 1, 1)
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
self.centralWidget().setLayout(grid)
self.show()
def openFileNameDialog(self):
options = QFileDialog.Options()
options |= QFileDialog.DontUseNativeDialog
fileName, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "",
"All Files (*);;Comma seperated files (*.csv)", options=options)
if fileName:
self.textbox.setText(fileName)
print(fileName)
@pyqtSlot()
def on_click(self):
self.openFileNameDialog()
print('PyQt5 button click')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
解决方案
您必须在第 2 行建立一个 Stretch,但在此之前您必须更正 rowSpan:
grid.addWidget(self.textbox, 0, 0, 0, 3)
grid.addWidget(self.textbox2, 0, 3, 0, 3)
为了理解,让我们回顾一下文档:
void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = ...)
这是一个过载功能。
此版本将给定的小部件添加到单元格网格中,跨越多行/列。单元格将从 fromRow 开始,fromColumn 跨越 rowSpan 行和 columnSpan 列。小部件将具有给定的对齐方式。
如果 rowSpan 和/或 columnSpan 为 -1,则小部件将分别延伸到底部和/或右侧边缘。
也就是说,rowSpan 指示小部件将占据多少行,但您将其指示为 0,因此布局将不再处理大小,而仅处理位置,您必须将其更改为 1。
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class App(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.title = 'Data visualizing'
self.left, self.top, self.width, self.height = 50, 50, 300, 100
self.initUI()
def initUI(self):
self.central_widget = QtWidgets.QWidget()
self.setCentralWidget(self.central_widget)
# Create textboxs
self.textbox = QtWidgets.QLineEdit(readOnly=True)
self.textbox2 = QtWidgets.QLineEdit(readOnly=True)
# Create buttons
self.button = QtWidgets.QPushButton('Load file 1',
toolTip = 'Click here to browse for the first data file')
self.button.clicked.connect(self.on_click)
self.button2 = QtWidgets.QPushButton('Load file 2',
toolTip = 'Click here to browse for the first data file')
self.button2.clicked.connect(self.on_click)
grid = QtWidgets.QGridLayout(self.centralWidget())
grid.addWidget(self.textbox, 0, 0, 1, 3)
grid.addWidget(self.textbox2, 0, 3, 1, 3)
grid.addWidget(self.button, 1, 1, 1, 1)
grid.addWidget(self.button2, 1, 4, 1, 1)
grid.setRowStretch(2, 1)
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
self.show()
def openFileNameDialog(self):
options = QtWidgets.QFileDialog.Options()
options |= QtWidgets.QFileDialog.DontUseNativeDialog
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "",
"All Files (*);;Comma seperated files (*.csv)", options=options)
if fileName:
self.textbox.setText(fileName)
print(fileName)
@QtCore.pyqtSlot()
def on_click(self):
self.openFileNameDialog()
print('PyQt5 button click')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
推荐阅读
- android - ItemDecoration - 如何创建垂直分隔线?
- typescript - “value”和“defaultValue”不会同时出现
- flutter - Flutter - 如何在不使用命名路由的情况下弹出两个屏幕?
- c++ - 无法使用 Qt Creator 5.12.3 在 Windows 10 中构建任何程序
- ice - zeroc-ice34已经编译安装,但是安装debian包时检测不到
- c# - 从另一个 ListBox 添加后未找到 ValueMember
- html - 以反应形式更改第 i 个输入字段 ondelete 按钮的布尔值
- ios - 如何使用设备支持的文件从 Xcode 10.2.1 在 iOS 13 设备中运行/安装应用程序
- javascript - Sequelize 中的关联未按预期工作
- react-native - 世博会 - 将方向锁定为横向