質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

受付中

QAbstractItemModel キーイベントの書き方 Python

goki_gottan
goki_gottan

総合スコア160

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1回答

0リアクション

0クリップ

149閲覧

投稿2022/08/09 09:05

以下コードのQAbstractItemModelの構造ですと、キーイベントやクローズイベントをどこに入れても動作しません。
正しくキーイベントやクローズイベントを動作させるためにはどこに挿入したら良いのでしょうか。

import pandas as pd from PyQt5 import QtWidgets, QtCore import sys,glob,os,threading from PyQt5.QtWidgets import QApplication,QDialog from PyQt5.QtCore import Qt import pyperclip from PyQt5.QtWidgets import QMainWindow, QWidget, QAction, QTableWidget,QTableWidgetItem,QVBoxLayout,QCheckBox,QHBoxLayout,QPushButton,QLabel,QLineEdit,QGridLayout,QProgressBar from PyQt5.QtGui import QPixmap,QFont import sqlite3 from PyQt5.QtWidgets import QMessageBox,QListWidget #テーブル名 z1=〇#データベース conn = sqlite3.connect(z1) c = conn.cursor() sql = "SELECT * FROM " + table_ +";" df=pd.read_sql(sql,conn) class PandasModel(QtCore.QAbstractItemModel): def __init__(self, parent=None, data_frame=None): super(PandasModel, self).__init__(parent) self.df = data_frame def closeEvent(self,event): global conn,app # conn.close() self.close() QtWidgets.QApplication.quit() def columnCount(self, parent=QtCore.QModelIndex()): return self.df.shape[1] def data(self, index, role=QtCore.Qt.DisplayRole): if not index.isValid(): return QtCore.QVariant() if role == QtCore.Qt.EditRole or role == QtCore.Qt.DisplayRole: return self.df.iat[index.row(), index.column()] return QtCore.QVariant() def flags(self, index): return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole): if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: return self.df.columns[section] if orientation == QtCore.Qt.Vertical and role == QtCore.Qt.DisplayRole: return self.df.index[section] def index(self, row, column, parent=QtCore.QModelIndex()): if not self.hasIndex(row, column, parent): return QtCore.QModelIndex() return self.createIndex(row, column, QtCore.QModelIndex()) def insertColumns(self, column, count, parent=QtCore.QModelIndex()): self.beginInsertColumns(parent, column, column + count - 1) columns = [ str(self.columnCount()+i+1) for i in range(count) ] left = self.df.iloc[:, 0:column] mid = pd.DataFrame(index=self.df.index, columns=columns) right = self.df.iloc[:, column+count-1:self.columnCount()] self.df = pd.concat( [left, mid, right], axis=1 ) self.endInsertColumns() def insertRows(self, row, count, parent=QtCore.QModelIndex()): self.beginInsertRows(parent, row, row + count - 1) indexes = [ str(self.rowCount()+i) for i in range(count) ] left = self.df[0:row] mid = pd.DataFrame(index=indexes, columns=self.df.columns) right = self.df[row+count-1:self.rowCount()] self.df = pd.concat([left, mid, right]) self.endInsertRows() def removeColumns(self, column, count, parent=QtCore.QModelIndex()): self.beginRemoveColumns(parent, column, column + count - 1) left = self.df.iloc[:, 0:column] right = self.df.iloc[:, column+count:self.columnCount()] self.df = pd.concat( [left, right], axis=1 ) self.endRemoveColumns() def removeRows(self, row, count, parent=QtCore.QModelIndex()): self.beginRemoveRows(parent, row, row + count - 1) left = self.df.iloc[0:row] right = self.df.iloc[row+count:self.rowCount()] self.df = pd.concat( [left, right], axis=0 ) self.endRemoveRows() def rowCount(self, parent=QtCore.QModelIndex()): return self.df.shape[0] def setData(self, index, value, role=QtCore.Qt.EditRole): if role == QtCore.Qt.EditRole: self.df.iat[index.row(), index.column()] = value return True return False def closeEvent(self,event): global conn,app print("t4") # conn.close() self.close() QtWidgets.QApplication.quit() class Delegate(QtWidgets.QStyledItemDelegate): def __init__(self, parent=None, setModelDataEvent=None): super(Delegate, self).__init__(parent) self.setModelDataEvent = setModelDataEvent def createEditor(self, parent, option, index): index.model().data(index, QtCore.Qt.DisplayRole) return QtWidgets.QLineEdit(parent) def setEditorData(self, editor, index): value = index.model().data(index, QtCore.Qt.DisplayRole) editor.setText(str(value)) def setModelData(self, editor, model, index): model.setData(index, editor.text()) if not self.setModelDataEvent is None: self.setModelDataEvent() def closeEvent(self,event): global conn,app print("t3") # conn.close() self.close() QtWidgets.QApplication.quit() def main(): def insert_row(): if len(tableView.selectedIndexes()) == 0: model.insertRows(model.rowCount(), 1) else: rows = list( set([ index.row() for index in tableView.selectedIndexes() ]) ) for row in rows[::-1]: model.insertRows(row, 1) def delete_row(): rows = list( set([ index.row() for index in tableView.selectedIndexes() ]) ) for row in rows[::-1]: model.removeRows(row, 1) def insert_column(): if len(tableView.selectedIndexes()) == 0: model.insertColumns(model.columnCount(), 1) else: columns = list( set([ index.column() for index in tableView.selectedIndexes() ]) ) for column in columns[::-1]: model.insertColumns(column, 1) def delete_column(): columns = list( set([ index.column() for index in tableView.selectedIndexes() ]) ) for column in columns[::-1]: model.removeColumns(column, 1) def exec_context_menu(point): menu = QtWidgets.QMenu(tableView) menu.addAction('Insert row', insert_row) menu.addAction('Delete row', delete_row) menu.addAction('Insert column', insert_column) menu.addAction('Delete column', delete_column) menu.exec( tableView.focusWidget().mapToGlobal(point) ) def closeEvent(self,event): global conn,app print("t1") # conn.close() self.close() QtWidgets.QApplication.quit() def keyPressEvent(self, event): # print(event.key()) current_index = self.view.currentIndex() row = current_index.row() column = current_index.column() key = event.key() modifiers = event.modifiers() print(row) app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QMainWindow() window.resize(600, 600) centralwidget = QtWidgets.QWidget(window) verticalLayout = QtWidgets.QVBoxLayout(centralwidget) tableView = QtWidgets.QTableView(centralwidget) model = PandasModel(tableView, df) tableView.setModel(model) tableView.setItemDelegate(Delegate()) tableView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) tableView.customContextMenuRequested.connect(exec_context_menu) verticalLayout.addWidget(tableView) window.setCentralWidget(centralwidget) window.show() app.exec() if __name__ == '__main__': main()

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/08/09 09:07

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

2022/08/14 04:10

こちらの質問が他のユーザーから「問題・課題が含まれていない質問」という指摘を受けました。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。