我正在使用QTableWidget来创建像excel这样的东西。其中一个QTableWidget列可以让用户使用多行更新注释。在使用QTextEdit之前,用户需要手动添加“\ n”来实现多行,但这不是友好的用户。我发现我可以将QTextEdit设置为QTableWidget。通过使用QTextEdit,我可以通过按“Enter”或“Shift + Enter”键入多行。但是,我想按下“Shift + Enter”时,它会转到下一行,但是当按下“Enter”时,它会运行self.update_MySQL函数。
以下是我的示例代码
import sys, itertools, sip
sip.setapi('QVariant',2)
from PyQt4 import QtCore, QtGui
class CustomTextEditDelegate(QtGui.QItemDelegate):
def createEditor(self, parent, option, index):
editor = QtGui.QTextEdit(parent)
return editor
def setEditorData(self, editor, index):
editor.setText(index.data())
def setModelData(self, editor, model, index):
model.setData(index, editor.toPlainText())
class PIX_DATABASE_UI(QtGui.QTableWidget):
def __init__(self, parent=None):
super(PIX_DATABASE_UI, self).__init__(parent)
### signal
self.update_tableWidget()
self.itemEntered.connect(self.update_MySQL)
# -----------------------------------------------------------------------------------------------------------------#
def update_MySQL(self):
print "MySQL Updated"
def update_tableWidget(self):
self.filter_columns = [u'remark']
self.setColumnCount(len(self.filter_columns))
self.setHorizontalHeaderLabels(self.filter_columns)
self.setRowCount(5)
for row, col in itertools.product(range(5), range(len(self.filter_columns))):
if self.filter_columns[col] == "remark":
width = self.sizeHint().width()
self.setColumnWidth(col, width * 0.75)
self.setItem(row, col, QtGui.QTableWidgetItem(str("ABC")))
self.setItemDelegateForColumn(col, CustomTextEditDelegate(self))
self.verticalHeader().setResizeMode(row, QtGui.QHeaderView.ResizeToContents)
# -----------------------------------------------------------------------------------------------------------------#
# -----------------------------------------------------------------------------------------------------------------#
if __name__ == '__main__':
global ui
try:
ui.close()
except:
pass
app = QtGui.QApplication(sys.argv)
app.setStyle(QtGui.QStyleFactory.create("Plastique"))
# print QtGui.QStyleFactory.keys()
ui = PIX_DATABASE_UI()
ui.show()
sys.exit(app.exec_())
结论:
谢谢eyllanesc,代码是帮我实现我想要实现的,稍微修改一下keyPressEvent。即使我按“Shift + Enter”,原始代码仍会发出。下面的代码是我修改的。
def keyPressEvent(self, event):
modifiers = QtGui.QApplication.keyboardModifiers()
if modifiers != QtCore.Qt.ShiftModifier and event.key() == QtCore.Qt.Key_Return:
self.enter.emit()
# If you do not want a new line uncomment the following
# return
super(TextEdit, self).keyPressEvent(event)
所以现在,在textEdit中编辑并按“Enter”后,它将运行self.update_MySQL,当按下“Shift + Enter”时,它将转到下一行。
您可以做的是更新模型的数据,为此必须发出调用commitData
方法的setModelData()
信号。
通过这样做,您可以使用信号itemChanged()
,因为项目的数据被修改。
import sys, itertools, sip
sip.setapi('QVariant',2)
from PyQt4 import QtCore, QtGui
class TextEdit(QtGui.QTextEdit):
pressed = QtCore.pyqtSignal()
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Return:
self.pressed.emit()
# If you do not want a new line uncomment the following
# return
super(TextEdit, self).keyPressEvent(event)
class CustomTextEditDelegate(QtGui.QItemDelegate):
def createEditor(self, parent, option, index):
editor = TextEdit(parent)
editor.pressed.connect(self.commitAndCloseEditor)
return editor
def setEditorData(self, editor, index):
editor.setText(index.data())
def setModelData(self, editor, model, index):
model.setData(index, editor.toPlainText())
def commitAndCloseEditor(self):
editor = self.sender()
self.commitData.emit(editor)
# if you want to close the editor uncomment the following
# self.closeEditor.emit(editor, QtGui.QAbstractItemDelegate.NoHint)
class PIX_DATABASE_UI(QtGui.QTableWidget):
def __init__(self, parent=None):
super(PIX_DATABASE_UI, self).__init__(parent)
### signal
self.update_tableWidget()
self.itemEntered.connect(self.update_MySQL)
self.itemChanged.connect(self.update_MySQL)
# -----------------------------------------------------------------------------------------------------------------#
def update_MySQL(self, it):
print("MySQL Updated", it.text())
def update_tableWidget(self):
self.filter_columns = [u'remark']
self.setColumnCount(len(self.filter_columns))
self.setHorizontalHeaderLabels(self.filter_columns)
self.setRowCount(5)
for row, col in itertools.product(range(5), range(len(self.filter_columns))):
if self.filter_columns[col] == "remark":
width = self.sizeHint().width()
self.setColumnWidth(col, width * 0.75)
self.setItem(row, col, QtGui.QTableWidgetItem(str("ABC")))
self.setItemDelegateForColumn(col, CustomTextEditDelegate(self))
self.verticalHeader().setResizeMode(row, QtGui.QHeaderView.ResizeToContents)
# -----------------------------------------------------------------------------------------------------------------#
# -----------------------------------------------------------------------------------------------------------------#
if __name__ == '__main__':
global ui
try:
ui.close()
except:
pass
app = QtGui.QApplication(sys.argv)
app.setStyle(QtGui.QStyleFactory.create("Plastique"))
# print QtGui.QStyleFactory.keys()
ui = PIX_DATABASE_UI()
ui.show()
sys.exit(app.exec_())