如何使用QPlainTextEdit编辑器结束编辑会话?

迈克·罗丹

这是MRE:

from PyQt5.QtCore import QRect, Qt, QAbstractTableModel
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QWidget, QVBoxLayout, QStyledItemDelegate, QPlainTextEdit, QShortcut
import sys, types
from PyQt5.QtGui import QFont

class HistoryTableViewDelegate( QStyledItemDelegate ):
    def __init__( self, history_table_view ):
        super().__init__( history_table_view )
    
    def createEditor(self, parent, option, index):
        editor = QPlainTextEdit( parent )
        editor.setSizeAdjustPolicy( QPlainTextEdit.SizeAdjustPolicy.AdjustToContents )
        self.model = index.model()
        column = index.column()
        row = index.row()
        parent.parent().verticalHeader().resizeSection( row, 150 )
        parent_font = QFont( self.parent().font() )
        parent_font.setPointSize( self.parent().font().pointSize() )
        editor.setFont( parent_font )
        def end_edit():
            print( f'end edit...')
            self.setModelData( editor, self.model, index )
            # how to end the edit session programmatically at this point?
            # self.destroyEditor( editor, index ) 
            
        end_edit_shortcut = QShortcut(  'Alt+E', editor, context = Qt.ShortcutContext.WidgetShortcut )
        end_edit_shortcut.activated.connect( end_edit )
        return editor
    
    def setEditorData(self, editor, index ):
        # NB superclass method sets the editor's text to empty string...
        self.original_text = index.model().data( index, Qt.DisplayRole )
        editor.insertPlainText( str( self.original_text ) )     
        
class HistoryTableModel( QAbstractTableModel ):
    def __init__( self ):
        super(HistoryTableModel, self).__init__()
        data = [
              [4, 9, 2],
              [1, 0, 0],
              [3, 5, 0],
        ]
        self._data = data

    def data(self, index, role):
        if role == Qt.DisplayRole:
            return self._data[index.row()][index.column()]

    def rowCount(self, index):
        return len(self._data)

    def columnCount(self, index):
        return len(self._data[0])
    
    def flags(self, index):
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable
    
    def setData(self, index, value, role ):
        if role == Qt.EditRole:
            self._data[ index.row() ][ index.column() ] = value  
        return True  

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.resize(600, 700 )
        self.centralwidget = QWidget(MainWindow)
        self.verticalLayoutWidget = QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry( QRect(20, 20, 500, 500))
        self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget)
        self.comps = []
        self.table_view = QTableView(self.verticalLayoutWidget)
        self.comps.append( self.table_view )
        self.table_view.setGeometry(QRect(20, 20, 200, 200))
        self.verticalLayout.addWidget(self.table_view)
        self.table_view.setModel( HistoryTableModel() )
        self.table_view.setTabKeyNavigation(False)
        self.table_view.setItemDelegate( HistoryTableViewDelegate( self.table_view ))
        MainWindow.setCentralWidget(self.centralwidget)

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

app = QApplication(sys.argv)
application = MainWindow()
application.show()
sys.exit(app.exec())

我想要一个多行编辑器,所以我想我已经知道要走的路是QPlainTextEdit尽管通过上述操作,按Alt-E会将数据提交到模型,但实际上并没有结束会话。例如,如果用鼠标单击另一个单元格,则可以看到已编辑的多行数据仍保留在已编辑的单元格中,这样做也将结束编辑会话。

如何以编程方式结束会话?

注意:按Alt-E后再按Escape是一种方法(两次击键)...但是我本质上想做的是按Enter与QLineEdit编辑器一起进行编程的任何事情

迈克·罗丹

得到它了...

def end_edit():
    self.setModelData( editor, self.model, index )
    self.closeEditor.emit( editor )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用“编辑环境变量”编辑器而不是“编辑系统变量”编辑器来编辑系统变量

如何设置 visudo 以使用与 Fedora 上的默认编辑器不同的编辑器?

在编辑器会话之间存储编辑器值

如何使用GWT编辑器框架进行验证?

如何使用monaco编辑器进行语法突出显示?

如何在中型编辑器中使用链接?

如何使Git使用我选择的编辑器进行提交?

如何使用requirejs从CDN加载ace编辑器主题?

如何使用CDN中的requirejs加载ace编辑器?

如何使用Vim编辑器替换括号中的模式

如何使用vim作为“ git show”编辑器?

如何使用zsh行编辑器插入特殊字符?

Atom编辑器-如何使用多光标选择矩形

如何在Swagger编辑器中使用Cookies

如何使用TinyMCE实施markdown编辑器?

如何在摩纳哥编辑器中使用 setValue?

如何使用StackBlitz编辑器“导入” TypeScript模块

如何使用Jodit编辑器正确插入上传的图片?

如何在 Wagtail CMS 中使用 WYSIWYG 编辑器?

使用sed编辑器时如何保持文件格式?

如何使用sed流编辑器编写美元符号($)

如何使用cypress在编辑器中选择文本

如何使用 HTML 编辑器清除 WebBrowser 控件的内容?

Atom编辑器:如何使用“ ^”键配置键绑定

如何在编辑器脚本中使用www

如何衡量我使用编辑器的时间?

如何使用Tiny MCE编辑器嵌入Instagram帖子

如何使用编辑器在本地提交 git 消息?

如何在VS代码编辑器中跳过结束标签(HTML)?