【问题标题】:Setting same instance of widget not working设置相同的小部件实例不起作用
【发布时间】:2018-07-21 20:47:43
【问题描述】:

我有一个 pyqt 应用程序,当在 gridlayout 上使用相同的 QLabel 类实例时,它不起作用。我看到只显示一个实例。

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QToolTip, QPushButton, QMessageBox, QAction, qApp, QMenu, QTextEdit, QToolBar, QMdiArea, QGridLayout, QLabel, QDialog
from PyQt5.QtGui import QFont, QIcon, QPainter, QVector2D
from PyQt5.Qt import QDesktopWidget, QMainWindow, Qt, QHBoxLayout, QVBoxLayout,\
    QLineEdit
from PyQt5.QtCore import QPoint


class Example(QDialog):
    count = 0
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs)            
        self.initUI()


    def initUI(self):
        grid = QGridLayout()
        a1 = QLabel('alphanumeric characters')
        a2 = QLabel('alphanumeric characters')

        grid.addWidget(QLabel('Name'), 1, 0)
        grid.addWidget(QLineEdit(), 1, 1)
        grid.addWidget(QLabel('only alphanumeric'), 1, 2)
        grid.addWidget(QLabel('Street1'), 2, 0)
        grid.addWidget(QLineEdit(), 2, 1)
        grid.addWidget(QLabel('only alphanumeric'), 2, 2)
        grid.addWidget(QLabel('Street2'), 3, 0)
        grid.addWidget(QLineEdit(), 3, 1)
        grid.addWidget(QLabel('only alphanumeric'), 3, 2)
        grid.addWidget(QLabel('City'), 3, 0)
        grid.addWidget(QLineEdit(), 3, 1)
        grid.addWidget(QLabel('only alphanumeric'), 3, 2)

        self.setLayout(grid)
        self.setGeometry(500, 500, 500, 500)
        self.setWindowTitle('Lines')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
#     ex.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 错字:将grid.addWidget(a1, 1, 0) grid.addWidget(a1, 1, 1)更改为grid.addWidget(a1, 1, 0) grid.addWidget(a2, 1, 1)
  • 我不能使用同一个实例 - a1 吗?我的网格将有 3 列和多行..第 3 列的大部分内容将只包含信息性消息 - '只有字母数字字符"
  • 您可以更好地解释自己,尝试将这两行更改为:grid.addWidget(a1, 1, 0, 2, 1)
  • 你不能使用同一个实例,你想得到什么?
  • 我已经编辑了代码,如果您注意到我创建了多个 QLabel 实例只是为了在网格的第 3 列上显示“仅字母数字”文本。

标签: python pyqt pyqt5 qgridlayout


【解决方案1】:

首先坐标从 (0, 0) 开始,所以我已经更正了这部分。

正题,不用一一相加,addWidget()方法被重载了,所以有一个4和5的参数,分别表示行和列的span。

void addWidget(QWidget *widget, int row, int column, Qt::Alignment 对齐 = ...)

void addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = ...)

import sys

from PyQt5.QtWidgets import QApplication, QDialog, QGridLayout, QLabel, QLineEdit


class Example(QDialog):
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs)            
        self.initUI()

    def initUI(self):
        grid = QGridLayout(self)
        a1 = QLabel('alphanumeric characters')
        a2 = QLabel('alphanumeric characters')

        grid.addWidget(QLabel('Name'), 0, 0)
        grid.addWidget(QLineEdit(), 0, 1)
        grid.addWidget(QLabel('Street1'), 1, 0)
        grid.addWidget(QLineEdit(), 1, 1)
        grid.addWidget(QLabel('Street2'), 2, 0)
        grid.addWidget(QLineEdit(), 2, 1)
        grid.addWidget(QLabel('City'), 3, 0)
        grid.addWidget(QLineEdit(), 3, 1)

        grid.addWidget(QLabel('only alphanumeric'), 0, 2, 4, 1)

        self.setGeometry(500, 500, 500, 500)
        self.setWindowTitle('Lines')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
#     ex.show()
    sys.exit(app.exec_())

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2021-04-29
    • 2017-03-02
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多