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

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

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

Q&A

解決済

1回答

3410閲覧

pyqtでレイアウト変更がしたい

ookura

総合スコア27

0グッド

0クリップ

投稿2020/10/29 07:58

前回質問内容
上記の内容で以前テーブルを挿入するための質問をしたものです。
テーブルがうまく挿入できないことへのアドバイスとしてsetLayout でレイアウトを組ませていただき、
挿入自体はできたのですが、今度はレイアウトを上手く変更できません。

自由な位置にウィジェットを配置したいのですが前回質問のアドバイスから
layoutを使うとsetGermetryは使えないということなので
.moveやresizeを試したのですがそれもうまくいきませんでした。

本当は下記のようなレイアウトにしたいのですが・・・

レイアウト

どなたかお詳しい方いらっしゃったらご教示いただけますと幸いです。

python

1# -*- coding: utf-8 -*- 2 3import numpy as np 4from PIL import Image 5import sys 6import pyocr.builders 7import cv2 8import sys 9import os 10 11from PyQt5 import QtWidgets,QtCore 12from PyQt5.QtWidgets import QInputDialog,QProgressBar, QPushButton, QRadioButton,QMessageBox,QLineEdit,QVBoxLayout,QTextEdit,QLabel,QTableWidget, QTableWidgetItem,QGridLayout 13from PyQt5.QtCore import pyqtSlot 14from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 15import matplotlib.pyplot as plt 16import glob 17 18from PyQt5.QtWidgets import (QWidget, QHBoxLayout, 19 QLabel, QApplication) 20from PyQt5.QtGui import QPixmap 21 22class Application(QtWidgets.QWidget): 23 def __init__(self): 24 super().__init__() 25 # UIの初期化 26 self.initUI() 27 28 # rootディレクトリ 29 self.root = r"C:\Users\ookura\Desktop\test\" 30 # 拡張子 31 self.ext = 'jpg' 32 33 # ファイルを配置 34 self.set_FileList() 35 36 # 画像 37 self.FileName = self.FileList.item(0).text() 38 39 # 画像を読み込む 40 self.load_ImageFile() 41 42 # Figureの初期化 43 self.initFigure() 44 45 # ファイルを変更した時のイベント 46 self.FileList.itemSelectionChanged.connect(self.FileList_Changed) 47 48 # UIの初期化 49 def initUI(self): 50 # Figure用のWidget 51 self.FigureWidget = QtWidgets.QWidget(self) 52 # FigureWidgetにLayoutを追加 53 self.FigureLayout = QtWidgets.QVBoxLayout(self.FigureWidget) 54 # Marginを消す 55 self.FigureLayout.setContentsMargins(0,0,0,0) 56 # ファイルのリスト 57 self.FileList = QtWidgets.QListWidget(self) 58 #table 59 self.tableWidget = QtWidgets.QTableWidget(self) 60 61 # 配置 62 #self.setGeometry(0, 0, 1920, 1080) # 画像 63 #self.FileList.setGeometry(0, 0, 200, 1000) # リスト 64 #self.FigureWidget.setGeometry(215, 50, 850, 600) # 画像表示 65 #self.tableWidget.setGeometry(1080, 50, 800, 600) # 画像表示 66 # Add box layout, add table to box layout and add box layout to widget 67 68 self.hbox = QHBoxLayout(self) # 横方向のレイアウト 69 self.hbox.addWidget(self.FileList) 70 self.hbox.addWidget(self.FigureWidget) 71 #self.hbox.addStretch(0) 72 self.hbox.addWidget(self.tableWidget) 73 self.setLayout(self.hbox) 74 self.resize(1920, 1080) 75 self.createTable() 76 77 self.FileList.move(500,500) 78 #ocrボタン設置 79 btn_ocr = QPushButton("OCR", self) 80 btn_ocr.setStyleSheet("color:black;background-color:white;font-size:14px;font-family:メイリオ;") 81 btn_ocr.move(1500, 565) 82 # クリックされたらbuttonClickedの呼び出し 83 btn_ocr.clicked.connect(self.ocr_buttonClicked) 84 85 # Figureの初期化 86 def initFigure(self): 87 # Figureを作成 88 self.Figure = plt.figure() 89 # FigureをFigureCanvasに追加 90 self.FigureCanvas = FigureCanvas(self.Figure) 91 # LayoutにFigureCanvasを追加 92 self.FigureLayout.addWidget(self.FigureCanvas) 93 94 self.axis = self.Figure.add_subplot(1,1,1) 95 self.axis_image = self.axis.imshow(self.image, cmap='gray') 96 plt.axis('off') 97 98 # ファイルを配置 99 def set_FileList(self): 100 # ファイルの読み込み 101 Files = glob.glob(self.root+'*.'+self.ext) 102 # ソート 103 self.Files = sorted(Files) 104 105 # ファイルリストに追加 106 for file in self.Files: 107 self.FileList.addItem(os.path.basename(file)) 108 109 # ファイルを変更した時の関数 110 def FileList_Changed(self): 111 # 選択しているファイルの名前を取得 112 self.FileName = self.FileList.selectedItems()[0].text() 113 # 画像を読み込み 114 self.load_ImageFile() 115 # Figureを更新 116 self.update_Figure() 117 118 # 画像ファイルを読み込む 119 def load_ImageFile(self): 120 # 画像を開く 121 image = Image.open(self.root + self.FileName) 122 # numpy.ndarrayに 123 self.image = np.asarray(image) 124 125 # Figureを更新 126 def update_Figure(self): 127 self.axis_image.set_data(self.image) 128 self.FigureCanvas.draw() 129 #テーブル 130 def createTable(self): 131 # Create table 132 #self.tableWidget = QTableWidget() 133 self.tableWidget.setRowCount(20) 134 self.tableWidget.setColumnCount(5) 135 self.tableWidget.setItem(0,0, QTableWidgetItem("Cell (1,1)")) 136 self.tableWidget.setItem(0,1, QTableWidgetItem("Cell (1,2)")) 137 self.tableWidget.setItem(0,3, QTableWidgetItem("Cell (2,1)")) 138 self.tableWidget.setItem(0,4, QTableWidgetItem("Cell (2,2)")) 139 self.tableWidget.setItem(0,5, QTableWidgetItem("Cell (3,1)")) 140 141 self.tableWidget.move(500,1000) 142 143 # table selection change 144 #self.tableWidget.doubleClicked.connect(self.on_click) 145 146 @pyqtSlot() 147 def on_click(self): 148 print("\n") 149 for currentQTableWidgetItem in self.tableWidget.selectedItems(): 150 print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text()) 151 152 def ocr_buttonClicked(self): 153 a, b, c, d, e, out = OCR(path) 154 self.load_ImageFile_ocr() 155 # Figureを更新 156 self.update_Figure_ocr() 157 # 画像ファイルを読み込む 158 def load_ImageFile_ocr(self): 159 # 画像を開く 160 image = out 161 # numpy.ndarrayに 162 self.image = np.asarray(image) 163 164 # Figureを更新 165 def update_Figure_ocr(self): 166 self.axis_image.set_data(self.image) 167 self.FigureCanvas.draw() 168 169 170QApp = QtWidgets.QApplication(sys.argv) 171app = Application() 172app.show() 173sys.exit(QApp.exec_()) 174

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

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

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

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

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

guest

回答1

0

ベストアンサー

レイアウト内で管理されるウィジェットには、
setGeometry と同様 move, resize も使いません。
setGeomery の役割を別けたメソッドで、どちらもレイアウトにより調整されます。

目的のレイアウトにするには、QGridLayout が適切です。
QBoxLayout でレイアウトを組む場合は以下の様に構成します。

QHBoxLayout ファイルリスト QVBoxLayout 画像 テーブル1 QVBoxLayout テーブル2 ボタン等

grid レイアウトの例

python

1 2import sys 3from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QGridLayout 4 5 6def main(): 7 app = QApplication(sys.argv) 8 9 win = QWidget() 10 # レイアウトの addWidget により、親ウィジェットは設定されます 11 panelA = QLabel("FileList") 12 panelB = QLabel("Image") 13 panelC = QLabel("Table1") 14 panelD = QLabel("Table2") 15 panelE = QLabel("Buttons") 16 17 # Layout には、親ウィジェットを指定すると 18 # win.setLayout(grid) を省略可能。 19 grid = QGridLayout(win) 20 21 # row, column, rowSpan, columnSpan 22 grid.addWidget(panelA, 0, 0, 2, 1) 23 grid.addWidget(panelB, 0, 1) 24 grid.addWidget(panelC, 0, 2) 25 grid.addWidget(panelD, 1, 1) 26 grid.addWidget(panelE, 1, 2) 27 grid.setContentsMargins(10, 10, 10, 10) 28 29 # FileList の横幅を固定 30 panelA.setMaximumWidth(200) 31 grid.setColumnMinimumWidth(0, 200) 32 33 # NOTE: win 自身はレイアウトで管理 (addWidget) されていない為 34 # resize 可能。 35 win.resize(400, 400) 36 win.show() 37 38 sys.exit(app.exec_()) 39 40 41if __name__ == '__main__': 42 main()

投稿2020/10/29 08:44

teamikl

総合スコア8760

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問