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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

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

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Q&A

1回答

803閲覧

PythonQt5のtableviewでセルを非活性

toccipc

総合スコア15

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

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

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

0グッド

0クリップ

投稿2022/07/27 00:25

編集2022/07/27 00:26

前提

PythonでQT5のtableviewでアプリを作成しています

実現したいこと

特定のセルを非活性で表示させる

特定のセルをボタンを押すことにより非活性・活性の切替をしたい

発生している問題

実現したいことに対する実装方法をネットで調査しても見つからない

該当のソースコード

table_data_ は本来MySQLのテーブルからのデータですが、中身を明かせないのでダミーです

python3.9

1import sys 2 3from PyQt5.QtCore import * 4from PyQt5.QtGui import * 5from PyQt5.QtWidgets import * 6 7table_data_ = {'1.':['','','','','','','','',''], 8 '2.':['3','非活性にしたい','非活性にしたい','4','5','6','非活性にしたい','8','9'], 9 '3.':['12','0','0','4','15','6','0','18','12']} 10 11class TableView(QTableWidget): 12 def __init__(self, data, *args): 13 QTableWidget.__init__(self, *args) 14 self.data = table_data_ 15 self.setData() 16 17 # 列のサイズ調整 18 self.resizeColumnsToContents() 19 # 行のサイズ調整 20 self.resizeRowsToContents() 21 def setData(self): 22 horHeaders = [] 23 for n, key in enumerate(sorted(self.data.keys())): 24 horHeaders.append(key) 25 for m, item in enumerate(self.data[key]): 26 newitem = QTableWidgetItem(item) 27 self.setItem(m, n, newitem) 28 self.setHorizontalHeaderLabels(horHeaders) 29 30class window(QWidget): 31 def __init__(self, parent = None): 32 super(window, self).__init__(parent) 33 34 windowWidth = 1300 35 windowHeight = 700 36 37 self.resize(windowWidth,windowHeight) 38 self.setWindowTitle("フォーム") 39 40 self.table = TableView(table_data_, 9, 3, self) 41 self.table.resize(windowWidth - 100,windowHeight - 100) 42 self.table.move(20,20) 43 44 self.button = QPushButton('button', self) 45 self.button.setStyleSheet("QPushButton{color:black;background-color:gray;}") 46 self.button.setStyleSheet("QPushButton:pressed{color:teal;background-color:coral;}") 47 self.button.move(windowWidth - 200,windowHeight - 50) 48 self.button.clicked.connect(self.change_table_val) 49 self.button2 = QPushButton('終了', self) 50 self.button2.setStyleSheet("QPushButton{color:black;background-color:gold;}") 51 self.button2.move(windowWidth - 100,windowHeight - 50) 52 self.button2.clicked.connect(self.exit) 53 54 # 行カウント 55 rowPosition = self.table.rowCount() 56 57 # ボタンウィジェットを設定 58 for num in range(rowPosition): 59 button = QPushButton(self) 60 button.setText('Click!') 61 # ボタンのイベントを登録 62 button.clicked.connect(self.change_table_val) 63 self.table.setCellWidget(num, 0, button) 64 65 66 # 値を変更させる 67 def change_table_val(self): 68 # 非活性→活性化 69 pass 70 71 72 self.table.setData() 73 # 画面を終了させる 74 def exit(self) -> None: 75 self.close() 76 77def main(): 78 app = QApplication(sys.argv) 79 ex = window() 80 ex.show() 81 sys.exit(app.exec_()) 82if __name__ == '__main__': 83 main() 84

気になること

ググって以下のソースを見つけました。
実装には加えてません。
def flags(self, index):
return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
がポイント?

よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

tableviewでアプリを作成しています

ですが、ソースコードは QTableWidget をサブクラス化しています。

Qt でのデータコンテナ系のウィジェットは~~Widget と ~~Viewがあり、
flagsをオーバーライドする方法は QTableView での実装方法です。

質問に掲載のソースコードは QTableWidgt を使っているので、
QTableView ではなく、QTableWidget の使い方を調べてください。

  • 対象セルのアイテム (QTableWidgetItem) を取り出して item = table.item(row, column)
  • アイテムに対するフラグを設定 item.setFlags(Qt.ItemIsEnabled)

QTableView を用いる場合は、flags メソッドをオーバーライドする方法を取りますが、
大幅にコードが異なるため、単純にクラスのみ差し替えとは行きません。
QTableView の使い方を調べてください。Model-View の理解が必須です。

投稿2022/08/01 06:05

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toccipc

2022/08/03 13:02

teratailのアクセスしにくささが発生してて確認おくれました。 いただいたお話をみて、これから確認します。
toccipc

2022/08/08 01:33

item.setFlags(Qt.ItemIsEnabled) が活性なので item.setFlags(Qt.NoItemFlags) ってことですか・・・
teamikl

2022/08/08 03:32 編集

すみません、例で提示したコードに不備がありました。 フラグには他の役割も設定されており、ビット演算で該当ビットをオン・オフにするという設定をします。 item.setFlags(item.flags() | Qt.ItemIsEnabled) # 該当フラグをオン item.setFlags(item.flags() & ~Qt.ItemIsEnabled) # 該当フラグをオフ item.setFlags(item.flags() ^ Qt.ItemIsEnabled) # オンの時オフに、オフの時オンに反転 ※ C++では、QFlags クラスのメソッドで、 よりわかりやすく、該当フラグをオン・オフする手段も提供してます。 PyQt に QFlags クラスは見当たりませんでした。 >item.setFlags(Qt.NoItemFlags) Qt.NoItemFlags は 0 なので、すべてのフラグをオフにするなら、 それでも期待通りの挙動になるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問