1

QTreeWidget がいくつかの itemwidget で満たされています。その主なウィジェットは QTextEdit になります。私が抱えている問題は、サイズを扱いやすいものに縮小しているようです。サイズ ポリシーを最大に設定する通常の方法は機能しないようです。コード例は次のとおりです。

from PyQt4.QtGui import *
from PyQt4.QtCore import *

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

        self.tree = QTreeWidget(self)
        self.tree.setColumnCount(1)
        self.setCentralWidget(self.tree)

        textEdit = QTextEdit()
        textEdit.setText("very Small Text Edit")
        sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.MinimumExpanding)
        textEdit.setSizePolicy(sizePolicy)

        itemWidget = QTreeWidgetItem()
        itemWidget.setText(0, "")
        self.tree.addTopLevelItem(itemWidget)
        self.tree.setItemWidget(itemWidget, 0, textEdit)        

        biggerTextEdit = QTextEdit()
        biggerTextEdit.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas et mauris in felis tempus molestie eu sit amet sapien. Proin dapibus pretium ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque feugiat semper sem a accumsan. Nulla sollicitudin enim quis velit blandit posuere. Ut fringilla vulputate dolor, a accumsan lectus gravida a. Sed convallis facilisis mi et ullamcorper. Integer consectetur aliquet odio sit amet posuere.")        

        itemWidget2 = QTreeWidgetItem()
        itemWidget2.setText(0, "")
        self.tree.addTopLevelItem(itemWidget2)
        self.tree.setItemWidget(itemWidget2, 0, biggerTextEdit)        

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    ui = MyMainWindow()
    ui.show()
    sys.exit(app.exec_())

テキストの長さに関係なく、テキスト編集の高さに影響を与えないように見えることに注意してください。QTextEdit 自体を (少なくとも垂直方向に) 可能な限り最小のサイズにスケーリングするにはどうすればよいでしょうか。前もって感謝します!

編集:QLabel(サイズ変更、表示、ワードワープに関しては、私が望むように機能します)を使用し、テキスト相互作用フラグを編集可能に設定して、この効果をごまかそうとしたことに注意してください。ラベルの編集済みテキストにアクセスする方法があれば、これはほとんど機能します。残念ながら、ラベルで .text() を呼び出すと、元のテキストが生成されます。QLineEdit は複数行またはワードラップにすることはできません。QTextEdit は複雑すぎるようです。

ここで問題になるのは、編集も可能な小さい (300 文字以下) テキスト表示ウィジェットを作成するのに最適なウィジェットは何かということです。

4

2 に答える 2

2

目標を達成するには、アイテム デリゲートをカスタマイズする必要があります。これは、アイテム デリゲートがツリー ウィジェットにプレゼンテーションおよび編集サービスを提供するためです。Qt ドキュメントには、モデル、ビュー、およびデリゲートに関する有用な情報がいくつかあります (チュートリアルを含む)。次のコードは、デリゲートを使用して問題を修正します。

from PyQt4.QtGui import *
from PyQt4.QtCore import *

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

        self.tree = QTreeWidget(self)
        self.tree.setColumnCount(1)
        self.tree.setItemDelegate(MyDelegate(self))
        self.setCentralWidget(self.tree)

        itemWidget = QTreeWidgetItem()
        itemWidget.setFlags(itemWidget.flags() | Qt.ItemIsEditable)
        itemWidget.setText(0, "very Small Text Edit")
        self.tree.addTopLevelItem(itemWidget)

        itemWidget2 = QTreeWidgetItem()
        itemWidget2.setFlags(itemWidget.flags() | Qt.ItemIsEditable)
        itemWidget2.setText(0, """very Small Text Edit\n
        very Small Text Edit\n
        very Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Editvery Small Text Edit""")
        self.tree.addTopLevelItem(itemWidget2)

class MyDelegate(QStyledItemDelegate):

    def sizeHint(self, option, index):
        default = QStyledItemDelegate.sizeHint(self, option, index)
        return QSize(default.width(), default.height() + 12)

    def createEditor(self, parent, option, index):
        editor = QTextEdit(parent)
        return editor

    def setEditorData(self, editor, index):
        text = index.model().data(index, Qt.DisplayRole).toString()
        editor.setText(text)

    def setModelData(self, editor, model, index):
        model.setData(index, QVariant(editor.toPlainText()))


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    ui = MyMainWindow()
    ui.show()
    sys.exit(app.exec_())

コードには、 の単純な再実装が含まれていますsizeHint()QTextEditメソッド内でカスタマイズできることにも注意してくださいcreateEditor。メソッドを再実装することpaint()もできます (必要に応じて異なります)。

サブクラス化は進むべき道ではないことに注意してくださいQTreeWidgetItem(それは でさえありませんQWidget)。ただしQTreeWidget、定義済みのツリー モデルを使用する便利なクラスであるため、モデル/ビュー プログラミングのフレームワークで問題を解決することは理にかなっています。

于 2012-09-22T14:58:30.017 に答える
1

QTextEditの代わりにサブクラス化することを含む解決策を思いつきましたQStyledItemDelegate。newQTextEditは、コンテンツに基づいて必要な高さを計算します。次に、シグナルを使用して、計算された高さを に送りQTreeWidgetItemます。setSizeHint()

以下のコード(PS私はPyQt5を使用しています)

import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt, pyqtSignal, QSize

class AdjustableTextEdit(QtWidgets.QTextEdit):

    td_size_sig=pyqtSignal(QSize)
    def __init__(self,parent=None):
        super(AdjustableTextEdit,self).__init__(parent)

        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.textChanged.connect(self.resizeTextEdit)
        self.document().documentLayout().documentSizeChanged.connect(
                self.resizeTextEdit)

    def resizeTextEdit(self):

        docheight=self.document().size().height()
        margin=self.document().documentMargin()
        self.setMinimumHeight(docheight+2*margin)
        self.setMaximumHeight(docheight+2*margin)
        return

    def resizeEvent(self,e):
        super(AdjustableTextEdit,self).resizeEvent(e)
        self.td_size_sig.emit(QSize(self.sizeHint().width(),
            self.maximumHeight()))
        return

class MainFrame(QtWidgets.QFrame):

    def __init__(self,parent=None):
        super(MainFrame,self).__init__(parent)

        ha=QtWidgets.QHBoxLayout(self)
        self.tree=QtWidgets.QTreeWidget(self)
        ha.addWidget(self.tree)

        self.addTextEditWidget('very small text edit')
        self.addTextEditWidget("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas et mauris in felis tempus molestie eu sit amet sapien. Proin dapibus pretium ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque feugiat semper sem a accumsan. Nulla sollicitudin enim quis velit blandit posuere. Ut fringilla vulputate dolor, a accumsan lectus gravida a. Sed convallis facilisis mi et ullamcorper. Integer consectetur aliquet odio sit amet posuere.")

        self.show()

    def addTextEditWidget(self,text):

        textEdit = AdjustableTextEdit()
        textEdit.setText(text)

        itemWidget = QtWidgets.QTreeWidgetItem()
        itemWidget.setText(0, "")

        self.tree.addTopLevelItem(itemWidget)
        self.tree.setItemWidget(itemWidget, 0, textEdit)
        textEdit.td_size_sig.connect(lambda size: itemWidget.setSizeHint(0,size))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ui = MainFrame()
    sys.exit(app.exec_())
于 2019-03-13T11:07:35.080 に答える