【问题标题】:Can't change size within layout无法在布局中更改大小
【发布时间】:2012-12-29 08:23:10
【问题描述】:

好吧,我有一个文本编辑器,上面有一个按钮...我希望文本编辑器位于布局内,以便它增加和减小其大小 QDialog,但我不想这样做按钮也是如此,顺便说一下,它没有我想要的大小并且无法更改它。我能做什么?

代码:

from PyQt4 import QtCore, QtGui
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class TextEditorDlg(QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.resize(500, 400)
        self.Grid = QtGui.QGridLayout(self)
        self.button = QtGui.QPushButton(self)
        self.Grid.addWidget(self.button, 0, 0)
        self.lineEdit = QtGui.QLineEdit(self)
        self.textEdit = QtGui.QTextEdit(self)
        self.Grid.addWidget(self.lineEdit, 1, 0)
        self.Grid.addWidget(self.textEdit, 2, 0)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    myapp = TextEditorDlg()
    myapp.show()
    sys.exit(app.exec_())

现在看到问题了吗?

【问题讨论】:

  • 你能再清楚一点吗?我的猜测是您可以将按钮放在带有一些垫片的QHBoxLayout 中以避免调整大小(参见addStretch 方法)。

标签: python layout pyqt qdialog


【解决方案1】:

首先我不明白你为什么使用QGridLayout。您是否意识到您根本没有使用网格?你应该简单地使用QVBoxLayout

无论如何,正如我在评论中提到的,您可能可以使用 QHBoxLayoutaddStretch 方法获得所需的“输出”:

import sys
from PyQt4 import QtCore, QtGui


class TextEditorDlg(QtGui.QDialog):
    def __init__(self, parent=None):
        super(TextEditorDlg, self).__init__(parent)
        self.resize(500, 400)

        self.button = QtGui.QPushButton(self)
        self.lineEdit = QtGui.QLineEdit(self)
        self.textEdit = QtGui.QTextEdit(self)

        self.button_layout = QtGui.QHBoxLayout()
        self.button_layout.addStretch()
        self.button_layout.addWidget(self.button)
        self.button_layout.addStretch()

        self.grid = QtGui.QGridLayout(self)

        self.grid.addLayout(self.button_layout, 0, 0)
        self.grid.addWidget(self.lineEdit, 1, 0)
        self.grid.addWidget(self.textEdit, 2, 0)

        # Alternative using QVBoxLayout:
        #self.layout = QtGui.QVBoxLayout(self)
        #self.layout.addLayout(self.button_layout)
        #self.layout.addWidget(self.line_edit)
        #self.layout.addWidget(self.text_edit)



if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    myapp = TextEditorDlg()
    myapp.show()
    sys.exit(app.exec_())

您可以调整将整数传递给addStretch 的拉伸量。

如果您想使用QGridLayout 将按钮放置在特定位置,那么您应该这样做:

import sys
from PyQt4 import QtCore, QtGui


class TextEditorDlg(QtGui.QDialog):
    def __init__(self, parent=None):
        super(TextEditorDlg, self).__init__(parent)
        self.resize(500, 400)

        self.button = QtGui.QPushButton(self)
        self.lineEdit = QtGui.QLineEdit(self)
        self.textEdit = QtGui.QTextEdit(self)

        self.grid = QtGui.QGridLayout(self)

        # Use the row-span and column-span arguments!
        self.grid.addWidget(self.button, 0, 0, 1, 1)
        self.grid.addWidget(self.lineEdit, 1, 0, 1, 3)
        self.grid.addWidget(self.textEdit, 2, 0, 1, 3)



if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    myapp = TextEditorDlg()
    myapp.show()
    sys.exit(app.exec_())

您可以使用正确的行和列索引以及行跨度和列跨度值将按钮准确地放置在您想要的位置。


编辑:如果要更改QPushButton 的大小,您必须更改按钮QSizePolicyQTextEdit 的策略。例如:

import sys
from PyQt4 import QtCore, QtGui


class TextEditorDlg(QtGui.QDialog):
    def __init__(self, parent=None):
        super(TextEditorDlg, self).__init__(parent)
        self.resize(500, 400)

        self.button = QtGui.QPushButton(self)
        self.button.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
        self.lineEdit = QtGui.QLineEdit(self)
        self.textEdit = QtGui.QTextEdit(self)
        self.textEdit.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)

        self.grid = QtGui.QGridLayout(self)

        # Use the row-span and column-span arguments!
        self.grid.addWidget(self.button, 0, 0, 3, 1)
        self.grid.addWidget(self.lineEdit, 3, 0, 1, 3)
        self.grid.addWidget(self.textEdit, 4, 0, 1, 3)



if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    myapp = TextEditorDlg()
    myapp.show()
    sys.exit(app.exec_())

您会看到按钮变大了。您可以通过更改行跨度来控制大小。 在self.grid.addWidget(self.button, 0, 0, 3, 1) 行中,增加/减少3 将增加/减少垂直尺寸(实际上是小部件占用的行数),增加/减少1 将改变水平尺寸。

请注意,如果您将小部件放置在跨越 3 行的 0 行,那么您必须小心不要在布局中添加新小部件时产生冲突。

【讨论】:

  • 非常感谢,但是如何增加第二个示例中按钮的高度?
  • 您必须使用按钮的行跨度 QTextEdit。无论如何,正如我已经不止一次说过的那样,在您的情况下使用QVBoxLayout 会容易得多。
猜你喜欢
  • 2017-04-18
  • 2013-10-25
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多