私がやりたいことは、QTableWidget のアイテムの上にマウスを置いたときに、QTableWidget アイテムの色を変更することです。
4 に答える
まず、ホバー イベントを取得するには、テーブル ウィジェットでマウス トラッキングをオンにする必要があります。
次に、適切なタイミングで背景色を変更できるように、マウスが表のセルに出入りするタイミングを知らせる信号を見つける必要があります。
QTableWidget クラスにはcellEntered / itemEnteredシグナルがありますが、マウスがセルを離れたときは何もありません。そのため、それを行うにはいくつかのカスタム シグナルを作成する必要があります。
TableWidget
以下のデモ スクリプトのクラスは、必要なcellExited
/itemExited
シグナルを設定し、マウスでホバリングしたときに項目の背景を変更するためにすべてを接続する方法を示しています。
from PyQt4 import QtGui, QtCore
class TableWidget(QtGui.QTableWidget):
cellExited = QtCore.pyqtSignal(int, int)
itemExited = QtCore.pyqtSignal(QtGui.QTableWidgetItem)
def __init__(self, rows, columns, parent=None):
QtGui.QTableWidget.__init__(self, rows, columns, parent)
self._last_index = QtCore.QPersistentModelIndex()
self.viewport().installEventFilter(self)
def eventFilter(self, widget, event):
if widget is self.viewport():
index = self._last_index
if event.type() == QtCore.QEvent.MouseMove:
index = self.indexAt(event.pos())
elif event.type() == QtCore.QEvent.Leave:
index = QtCore.QModelIndex()
if index != self._last_index:
row = self._last_index.row()
column = self._last_index.column()
item = self.item(row, column)
if item is not None:
self.itemExited.emit(item)
self.cellExited.emit(row, column)
self._last_index = QtCore.QPersistentModelIndex(index)
return QtGui.QTableWidget.eventFilter(self, widget, event)
class Window(QtGui.QWidget):
def __init__(self, rows, columns):
QtGui.QWidget.__init__(self)
self.table = TableWidget(rows, columns, self)
for column in range(columns):
for row in range(rows):
item = QtGui.QTableWidgetItem('Text%d' % row)
self.table.setItem(row, column, item)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.table)
self.table.setMouseTracking(True)
self.table.itemEntered.connect(self.handleItemEntered)
self.table.itemExited.connect(self.handleItemExited)
def handleItemEntered(self, item):
item.setBackground(QtGui.QColor('moccasin'))
def handleItemExited(self, item):
item.setBackground(QtGui.QTableWidgetItem().background())
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window(6, 3)
window.setGeometry(500, 300, 350, 250)
window.show()
sys.exit(app.exec_())
次の簡単なコードで証明されているように、適切なシグナルを使用して目標を簡単に達成できます。
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class TableViewer(QMainWindow):
def __init__(self, parent=None):
super(TableViewer, self).__init__(parent)
self.table = QTableWidget(3, 3)
for row in range (0,3):
for column in range(0,3):
item = QTableWidgetItem("This is cell {} {}".format(row+1, column+1))
self.table.setItem(row, column, item)
self.setCentralWidget(self.table)
self.table.setMouseTracking(True)
self.current_hover = [0, 0]
self.table.cellEntered.connect(self.cellHover)
def cellHover(self, row, column):
item = self.table.item(row, column)
old_item = self.table.item(self.current_hover[0], self.current_hover[1])
if self.current_hover != [row,column]:
old_item.setBackground(QBrush(QColor('white')))
item.setBackground(QBrush(QColor('yellow')))
self.current_hover = [row, column]
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
tv = TableViewer()
tv.show()
sys.exit(app.exec_())
他の信号にも興味があるかもしれません。特にitemEntered
. ただし、項目の編集と表示を完全に制御したい場合は、デリゲートを (QTableWidget.setItemDelegate
メソッドを介して) 使用することを強くお勧めします。
更新:
申し訳ありませんが、問題の 2 番目の部分、つまりマウスがセルから出たときに何が起こるかを忘れていました。その場合でも、イベントを使用せずに問題を簡単に解決できます。更新されたコードを参照してください。