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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4236閲覧

QTableWidgetのテーブルの最終行を取得したい

ookura

総合スコア27

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2020/11/02 06:23

編集2020/11/03 01:58

pyqtで画像のようなテーブルがあるアプリを作成中です。

テーブル上の行がすべて空白だった場合、最終行とみなしてその行にデータを入力していく
プログラムを組みたいのですがうまくいきません。

1行分の入力されたデータ1つずつを全て連結して内容が空白であれば最終行とみなそうとすると、
空白セルを連結しようとした時にエラーメッセージも残さずアプリケーションが終了してしまいます。

上記の組み方がスマートか不明なのですが、空白行の判定の仕方、または別のスマートな方法を
ご存知の方がいらっしゃったらご教示いただけませんでしょうか。

よろしくお願いします。

参考
#追記
組み上げ中のコードが入力数制限で記載できなかった為、
似たようなものを別途作成しました。
self.tableWidget.item(j, i).text() を空白のセル部分で取得しようとすると
アプリケーションが終了してしまいます。
引き続きご教示いただけますと幸いです。

python

1import sys 2from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAction, QTableWidget,QTableWidgetItem,QVBoxLayout 3from PyQt5.QtGui import QIcon 4from PyQt5.QtCore import pyqtSlot 5 6class App(QWidget): 7 8 def __init__(self): 9 super().__init__() 10 self.title = "PyQt5 table - pythonspot.com" 11 self.left = 0 12 self.top = 0 13 self.width = 300 14 self.height = 200 15 self.initUI() 16 17 def initUI(self): 18 self.setWindowTitle(self.title) 19 self.setGeometry(self.left, self.top, self.width, self.height) 20 21 self.createTable() 22 23 # Add box layout, add table to box layout and add box layout to widget 24 self.layout = QVBoxLayout() 25 self.layout.addWidget(self.tableWidget) 26 self.setLayout(self.layout) 27 28 # Show widget 29 self.show() 30 31 def createTable(self): 32 # Create table 33 self.tableWidget = QTableWidget() 34 self.tableWidget.setRowCount(4) 35 self.tableWidget.setColumnCount(4) 36 self.tableWidget.setItem(0,0, QTableWidgetItem("Cell (1,1)")) 37 self.tableWidget.setItem(0,1, QTableWidgetItem("Cell (1,2)")) 38 self.tableWidget.setItem(1,0, QTableWidgetItem("Cell (2,1)")) 39 #self.tableWidget.setItem(1,1, QTableWidgetItem("Cell (2,2)")) 40 #self.tableWidget.setItem(2,0, QTableWidgetItem("Cell (3,1)")) 41 self.tableWidget.setItem(2,1, QTableWidgetItem("Cell (3,2)")) 42 self.tableWidget.setItem(3,0, QTableWidgetItem("Cell (4,1)")) 43 self.tableWidget.setItem(3,1, QTableWidgetItem("Cell (4,2)")) 44 self.tableWidget.move(0,0) 45 46 # table selection change 47 self.tableWidget.doubleClicked.connect(self.on_click) 48 49 50 @pyqtSlot() 51 def on_click(self): 52 print("\n") 53 for currentQTableWidgetItem in self.tableWidget.selectedItems(): 54 fragA = True 55 fragB = False 56 word ="" 57 i = 0 58 j = 0 59 while fragA: 60 for s in range(4): 61 if self.tableWidget.item(j, i).text() != "": 62 fragB = True 63 else:break 64 65 i += 1 66 if fragB == True: 67 break 68 j=j+1 69 i = 0 70 71 # 72 print(self.tableWidget.item(1,1).text()) 73 74if __name__ == "__main__": 75 app = QApplication(sys.argv) 76 ex = App() 77 sys.exit(app.exec_())
teamikl👍を押しています

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

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

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

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

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

tiitoi

2020/11/02 07:12

現状のコードを記載してください
ookura

2020/11/03 01:59 編集

遅くなりまして申し訳ありません。 入力制限の為、コード再編して記載しました。 ※最終行取得は割愛しています。(空白セル取得部分で引っかかっています。) ご確認をお願いします。
guest

回答1

0

ベストアンサー

空白セルを連結しようとした時にエラーメッセージも残さずアプリケーションが終了してしまいます。

再現できる最小のコードを提示してください。

または別のスマートな方法をご存知の方がいらっしゃったらご教示いただけませんでしょうか。

QTableWidget ではなく QTableView と TableModel の利用がスマートな方法です。
データに関しては、終端の判別の必要はなくなり、リストに追加するのみで済みます。

但し、コードの記述量は増えるので Model/View 分離のコンセプトへの理解がないと、
恩恵が分かり難いかもしれません。
(拡張性や保守性に優れた方法という意図で、簡単な方法では有りません)

投稿2020/11/02 16:28

teamikl

総合スコア8760

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

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

ookura

2020/11/03 02:03

コードが最小に収まらなかった為、近いものを再編して追記しました。 お手数ですがご確認をお願いします。 Qtableviewは一度入力されたリストの書き換え、編集はできますか? Qtablewidgetだと書き換え・編集が容易だった為使用しているのですが、 書き換えが出来るのであれば多少コードが長くなってもviewに置き換えをしようと思います。 お手数ですが、ご教示いただけますと幸いです。
teamikl

2020/11/03 05:25 編集

>Qtableviewは一度入力されたリストの書き換え、編集はできますか? 可能です。QTableView は、高機能になった Table と考えて良いです。但し、 小規模な場合は、手間に見合う恩恵があるかどうかという点で QTableWidget で十分なことも有ります。 使い分けに関しては、主に中~大規模向 例えばデータベースの内容を表示するとき等、 メモリに乗り切らないデータを扱う際に、QTableView/TableModel が使われます。 小規模な場合でも、今回のように、末尾の判定をQTableView の内部状態に依存する場合、 データ(Modelに当たる部分)を別の変数にリストとして持っておけば、 末尾判定の必要なく、(データに関しては) 要素の追加のみで済みます。 その後に GUI の表示部分を更新といった手順を取ります。 QTableWidget を使っても同様のアプローチで実装できますが、 このデータ部分と表示の分離を定型化したのが QTableView/TableModel です。 ※ 恩恵部分が解りにくいと思うので、注釈 末尾の空行判定では、計算量オーダーは O(n) リストの長さに比例して時間がかかります。 通常のリストに要素を追加(list.append) では O(1) リストの長さに関わらず一定です。 ---- コードに関しては、(while flagA で無限ループになって) 正常に実行できてませんが - item() が None を帰す場合があるかもしれない。 item(j, i).text() - ループが多重になっていて終了条件がない  - break は内側のforループを抜けます  - while flagA: ... flagA を変更するコードがない (※最終行取得は割愛しています。・・・に当たる部分?) 空白セル取得部分に関して言えば、.text() を呼ぶ前に、先に item() の戻り値チェックが必要です item = self.tableWidget.item(j, i) if item and item.text() != "":
teamikl

2020/11/03 05:46

ループの骨格は、 i, j のみでよいのでは。変数 s が未使用です。 (コメント内の為、インデントは全角スペースに置き換えてます) for j in range(行数):  for i in range(列数):   item = self.tableWidget.item(j, i)
ookura

2020/11/03 08:19

とても丁寧にお教えいただき本当にありがとうございます。 すごく勉強になります。 完全に問題解決した上にループ文もスマートにできました! tableViewに関しては使ったことがなかったですが、興味がわいたので使ってみようと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問