在单个布局中创建表和按钮

问题描述 投票:1回答:1

我想在python3中使用pyqt5在单个布局中创建一个表和一个按钮。我创建了一个按钮,然后创建了一个表,但是表隐藏了该按钮。我需要使按钮和表格都显示在单个布局中。我不需要pyqtdesigner回答,我只想在pyqt5中做。

from PyQt5.QtWidgets import (QWidget, QLineEdit, QPushButton, QHBoxLayout, QVBoxLayout, QApplication,
                             QLabel, QAction, QMainWindow, qApp, QFileDialog, QTableWidget, QTableWidgetItem)
from PyQt5.QtCore import pyqtSlot, QRect

import sys

class MyMainWindow(QMainWindow):

    def __init__(self, dialog):
        QMainWindow.__init__(self)

        #self.setupUi(dialog)

        self.setWindowTitle('Testing ')
        button = QPushButton('PyQt5 button', self)
        button.setToolTip('This is an example button')
        button.move(100, 70)

        # table

        self.setGeometry(870, 20, 400, 400)
        wid = QWidget(self)
        self.createTable()
        self.setCentralWidget(wid)
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget)
        wid.setLayout(self.layout)
        self.home()

    def home(self):
        self.show()


    def close_application(self):
        sys.exit()


    def createTable(self):
        # Create table
        self.tableWidget = QTableWidget()
        self.tableWidget.setGeometry(QRect(310, 10, 311, 161))
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(2)
        self.tableWidget.setItem(0, 0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(0, 1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(1, 0, QTableWidgetItem("Cell (2,1)"))
        self.tableWidget.setItem(1, 1, QTableWidgetItem("Cell (2,2)"))
        self.tableWidget.setItem(2, 0, QTableWidgetItem("Cell (3,1)"))
        self.tableWidget.setItem(2, 1, QTableWidgetItem("Cell (3,2)"))
        self.tableWidget.setItem(3, 0, QTableWidgetItem("Cell (4,1)"))
        self.tableWidget.setItem(3, 1, QTableWidgetItem("Cell (4,2)"))
        self.tableWidget.move(0, 0)
        self.tableWidget.doubleClicked.connect(self.on_click)

    @pyqtSlot()
    def on_click(self):
        print("\n")
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text())


if __name__ == '__main__':
    app = QApplication([])
    dialog = QMainWindow()
    foo = MyMainWindow(dialog)
    foo.show()
    sys.exit(app.exec_())

我只得到这种输出。我需要将按钮和表格都显示在一个对话框中

enter image description here

我得到这样的输出

enter image description here

我想使按钮和桌子都达到特定的尺寸,如下图所示输出:

enter image description here

python python-3.x pyqt pyqt5
1个回答
1
投票

如果您希望能够自由设置窗口小部件的几何形状,则不能将它们添加到布局中,但是它们需要具有父级(将在其中显示窗口小部件)。您无法在没有布局的情况下“添加” tablewidget,因为您没有为其分配父级就创建了它。

使用QMainWindow也需要一定注意,因为它具有自己的内部布局(用于为主窗口添加特定的小部件,如菜单栏,状态栏和停靠/工具栏),因此设置[ C0],并将其用作子小部件的父级。有关更多信息,请阅读centralWidget()

centralWidget()

有一个陷阱。通常不鼓励使用“免费”窗口小部件,尤其是如果窗口可以由用户或系统调整大小(例如,如果屏幕不够大),则可能会隐藏部分界面。这就是您首先通过设置几何来实际执行的操作。通过运行上面的代码(使用您在示例中设置的几何形状),结果如下:

Qt Main Window Framework documentation

虽然您可以使用class MyMainWindow(QMainWindow): def __init__(self, dialog): QMainWindow.__init__(self) self.setWindowTitle('Testing ') self.setGeometry(870, 20, 400, 400) central = QWidget(self) self.setCentralWidget(central) button = QPushButton('PyQt5 button', central) button.setToolTip('This is an example button') button.move(100, 70) self.tableWidget = QTableWidget(self.centralWidget()) self.tableWidget.setGeometry(QRect(310, 10, 311, 161)) 来强制窗口大小,但在这种情况下也不建议这样做:不同的系统和平台绘制具有不同大小的窗口小部件,并且最终可能会得到一个在计算机上看起来不错的界面,而它不在其他人的身上。

如果您想使用与显示的外观类似的伪固定版式,则无论如何都应使用版式,然后将spacings添加到版式中。可以通过添加用作分隔符,QSpacerItems或拉伸的空QWidget来添加间距(对于框布局,网格布局,可能需要创建空的列和行并设置其拉伸)。

table hidden

这是结果:

setWindowSize()

© www.soinside.com 2019 - 2024. All rights reserved.