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

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

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

Q&A

解決済

1回答

1257閲覧

tablewidgetを埋め込みたい

ookura

総合スコア27

0グッド

0クリップ

投稿2020/10/29 02:38

下記サイトを参考に画像ビューアーを作成し、さらにテーブルを埋め込もうと思ったのですがうまくいきません。
https://qiita.com/ceptree/items/c3a7c52cdd152c9f62d9
テーブルは下記サイトを参考に行いました
https://qiita.com/MamoruItoi/items/94641421aeac2eafb5b1#pyqt5-table

テーブルをGUIウィンドウの右側に設置したかったので、
setGeometryで位置を調整したりしてみたのですが
メインウィンドウにかぶさるように表示されてしまい、
setLayoutの記述する順番がおかしいかと思い、ウィジェット配置後に変更したら
今度はウィンドウは希望の位置なのですが、テーブルが表示されませんでした。

どなたかお詳しい方、ご教示いただけませんでしょうか。
よろしくお願いします。

python#

1 2import numpy as np 3from PIL import Image 4import sys 5import sys 6import os 7 8from PyQt5 import QtWidgets,QtCore 9from PyQt5.QtWidgets import QInputDialog,QProgressBar, QPushButton, QRadioButton,QMessageBox,QLineEdit,QVBoxLayout,QTextEdit,QLabel,QTableWidget, QTableWidgetItem 10from PyQt5.QtCore import pyqtSlot 11from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 12import matplotlib.pyplot as plt 13import glob 14 15class Application(QtWidgets.QWidget): 16 def __init__(self): 17 super().__init__() 18 # UIの初期化 19 self.initUI() 20 21 # rootディレクトリ※指定フォルダ選択 22 self.root = r"C:\Users\ookura\Desktop\test1\" 23 # 拡張子 24 self.ext = 'jpg' 25 26 # ファイルを配置 27 self.set_FileList() 28 29 # 画像 30 self.FileName = self.FileList.item(0).text() 31 32 # 画像を読み込む 33 self.load_ImageFile() 34 35 # Figureの初期化 36 self.initFigure() 37 38 # ファイルを変更した時のイベント 39 self.FileList.itemSelectionChanged.connect(self.FileList_Changed) 40 41 # UIの初期化 42 def initUI(self): 43 # Figure用のWidget 44 self.FigureWidget = QtWidgets.QWidget(self) 45 # FigureWidgetにLayoutを追加 46 self.FigureLayout = QtWidgets.QVBoxLayout(self.FigureWidget) 47 # Marginを消す 48 self.FigureLayout.setContentsMargins(0,0,0,0) 49 50 # ファイルのリスト 51 self.FileList = QtWidgets.QListWidget(self) 52 53 #table 54 self.tableWidget = QtWidgets.QTableWidget(self) 55 56 # 配置 57 self.setGeometry(0, 0, 1920, 1080) # 画像 58 self.FileList.setGeometry(5, 50, 200, 1000) # リスト 59 self.FigureWidget.setGeometry(215, 50, 850, 600) # 画像表示 60 self.tableWidget.setGeometry(QtCore.QRect(1080, 50, 800, 600) ) # 画像表示 61 62 # Add box layout, add table to box layout and add box layout to widget 63 self.tableWidget.layout = QVBoxLayout(self.tableWidget) 64 self.tableWidget.layout.addWidget(self.tableWidget) 65 self.setLayout(self.tableWidget.layout) 66 67 self.createTable() 68 # Figureの初期化 69 def initFigure(self): 70 # Figureを作成 71 self.Figure = plt.figure() 72 # FigureをFigureCanvasに追加 73 self.FigureCanvas = FigureCanvas(self.Figure) 74 # LayoutにFigureCanvasを追加 75 self.FigureLayout.addWidget(self.FigureCanvas) 76 77 self.axis = self.Figure.add_subplot(1,1,1) 78 self.axis_image = self.axis.imshow(self.image, cmap='gray') 79 plt.axis('off') 80 81 # ファイルを配置 82 def set_FileList(self): 83 # ファイルの読み込み 84 Files = glob.glob(self.root+'*.'+self.ext) 85 # ソート 86 self.Files = sorted(Files) 87 88 # ファイルリストに追加 89 for file in self.Files: 90 self.FileList.addItem(os.path.basename(file)) 91 92 # ファイルを変更した時の関数 93 def FileList_Changed(self): 94 # 選択しているファイルの名前を取得 95 self.FileName = self.FileList.selectedItems()[0].text() 96 # 画像を読み込み 97 self.load_ImageFile() 98 # Figureを更新 99 self.update_Figure() 100 101 # 画像ファイルを読み込む 102 def load_ImageFile(self): 103 # 画像を開く 104 image = Image.open(self.root + self.FileName) 105 # numpy.ndarrayに 106 self.image = np.asarray(image) 107 108 # Figureを更新 109 def update_Figure(self): 110 self.axis_image.set_data(self.image) 111 self.FigureCanvas.draw() 112 #テーブル 113 def createTable(self): 114 # Create table 115 self.tableWidget = QTableWidget() 116 self.tableWidget.setRowCount(4) 117 self.tableWidget.setColumnCount(2) 118 self.tableWidget.setItem(0,0, QTableWidgetItem("Cell (1,1)")) 119 self.tableWidget.setItem(0,1, QTableWidgetItem("Cell (1,2)")) 120 self.tableWidget.setItem(1,0, QTableWidgetItem("Cell (2,1)")) 121 self.tableWidget.setItem(1,1, QTableWidgetItem("Cell (2,2)")) 122 self.tableWidget.setItem(2,0, QTableWidgetItem("Cell (3,1)")) 123 self.tableWidget.setItem(2,1, QTableWidgetItem("Cell (3,2)")) 124 self.tableWidget.setItem(3,0, QTableWidgetItem("Cell (4,1)")) 125 self.tableWidget.setItem(3,1, QTableWidgetItem("Cell (4,2)")) 126 self.tableWidget.move(0,0) 127 128 # table selection change 129 self.tableWidget.doubleClicked.connect(self.on_click) 130 131 @pyqtSlot() 132 def on_click(self): 133 print("\n") 134 for currentQTableWidgetItem in self.tableWidget.selectedItems(): 135 print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text()) 136 137 138 139QApp = QtWidgets.QApplication(sys.argv) 140app = Application() 141app.show() 142sys.exit(QApp.exec_()) 143

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

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

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

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

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

guest

回答1

0

ベストアンサー

テーブルをGUIウィンドウの右側に設置したかったので、

まずは、他のウィジェットは使わずに、レイアウトを仮組して見ると良いです。

setGeometryで位置を調整したりしてみたのですが
メインウィンドウにかぶさるように表示されてしまい、

setLayoutの記述する順番がおかしいかと思い、ウィジェット配置後に変更したら
今度はウィンドウは希望の位置なのですが、テーブルが表示されませんでした。

問題点は幾つか有り

  • setLayout を使う場合、同じウィジェットにsetGeometry は使えません。

 レイアウト自体がウィンドウのリサイズ等のイベントにより、
自動でサイズ内部を計算し、内部で setGeometry で調整してます。

  • ウィジェットは親子関係を持ちます。

 自分自身のレイアウトに、自分自身を入れることはできません。

コードの該当箇所

python

1 # Add box layout, add table to box layout and add box layout to widget 2 self.tableWidget.layout = QVBoxLayout(self.tableWidget) 3 self.tableWidget.layout.addWidget(self.tableWidget) 4 self.setLayout(self.tableWidget.layout)

実行時に警告が表示されるはずです。

QLayout: Cannot add parent widget QTableWidget/ to its child layout QVBoxLayout
  • self.tableWidget が createTable にで2度生成されている
#table self.tableWidget = QtWidgets.QTableWidget() # 略 self.createTable() # createTable() 内でも、同じインスタンス変数を上書き # こちらの tableWidget は # self を与えていない・レイアウト設定されていない為 # 何処にも表示されていません def createTable(self): self.tableWidget = QTableWidget()

  • 右側に設置 QHBoxLayout を使います
  • setGeometry を辞めて Layout により配置する
  • tableWidget が2重になっている問題を修正

 (ウィジェットの親子関係は、レイアウトを使う事で自然に解消します)

# QHBoxLayout の import を追加 from PyQt5.QtWidgets import QHBoxLayout # initUI 内 #table self.tableWidget = QtWidgets.QTableWidget(self) # 配置 ... レイアウトを使う為、取りやめ #self.setGeometry(0, 0, 1920, 1080) # 画像 #self.FileList.setGeometry(5, 50, 200, 1000) # リスト #self.FigureWidget.setGeometry(215, 50, 850, 600) # 画像表示 #self.tableWidget.setGeometry(QtCore.QRect(1080, 50, 800, 600) ) # 画像表示 # Add box layout, add table to box layout and add box layout to widget self.hbox = QHBoxLayout(self) # 横方向のレイアウト self.hbox.addWidget(self.FileList) self.hbox.addWidget(self.FigureWidget) self.hbox.addWidget(self.tableWidget) self.setLayout(self.hbox) self.resize(1920, 1080) self.createTable() def createTable(self): # Create table # self.tableWidget = QTableWidget() # <-- 2重に生成される # 略 # self.tableWidget.move(0,0) # <-- レイアウトに任せるので不要

投稿2020/10/29 05:20

teamikl

総合スコア8664

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

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

ookura

2020/10/29 07:10

即解決いたしました! 詳細なご説明までありがとうございます。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問