PyQt5のTableViewでSQLite3で引っ張ってきたデータを表出力しております。
その後、その表(テーブル)のあるセルを修正する際、修正時にオートコンプリート機能を追加できないでしょうか?
下記は、オートコンプリート機能を実装する前です。
from PyQt5.QtWidgets import * from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAction, QTableWidget,QTableWidgetItem,QVBoxLayout,QCheckBox,QHBoxLayout,QPushButton from PyQt5.QtGui import QIcon from PyQt5 import QtGui from PyQt5.QtCore import pyqtSlot import sys import pandas as pd import sqlite3 import sip z1=r"hoge" r1="hoge.db" #テーブル名 table_="city1" conn = sqlite3.connect(z1 + '\\' + r1) c = conn.cursor() sql = "SELECT * FROM " + table_ +";" df=pd.read_sql(sql,conn) num1=len(df.columns) num2=len(df) df=df.fillna("-") data=df.to_dict(orient='list') color_style="QPushButton {background-color: #DCDCDC; height: 30px; color: black; font: 30px; border-radius: 30px;} \ QPushButton:hover {background: #708090} \ QPushButton:pressed {background: #000080}" class TableView(QTableWidget): def __init__(self, data, *args): QTableWidget.__init__(self, *args) self.data = data self.setData() self.resizeColumnsToContents() self.resizeRowsToContents() def setData(self): horHeaders = [] for n, key in enumerate(self.data.keys()): horHeaders.append(key) for m, item in enumerate(self.data[key]): newitem = QTableWidgetItem(item) self.setItem(m, n, newitem) self.setHorizontalHeaderLabels(horHeaders) class window(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.table = TableView(data, num2, num1, self) self.button = QPushButton('削除', self) self.button1 = QPushButton('修正', self) self.button2 = QPushButton('終了', self) self.button.clicked.connect(self.clickCallback) self.button1.clicked.connect(self.clickCallback1) self.button2.clicked.connect(self.clickCallback2) title = QLabel('Title') author = QLabel('Author') review = QLabel('Table') review1 = QLabel('処理') titleEdit = QLineEdit() authorEdit = QLineEdit() reviewEdit = QTextEdit() grid = QGridLayout() grid.setSpacing(10) grid.addWidget(title, 1, 0) grid.addWidget(titleEdit, 1, 1) grid.addWidget(author, 2, 0) grid.addWidget(authorEdit, 2, 1) grid.addWidget(review, 3, 0) grid.addWidget(self.table, 3, 1, 1, 3) grid.addWidget(review1, 4, 0) grid.addWidget(self.button, 4, 1,1,1) grid.setColumnStretch(1, 1) grid.addWidget(self.button1, 4, 2,1,1) grid.setColumnStretch(2, 1) grid.addWidget(self.button2, 4, 3,1,1) grid.setColumnStretch(3, 1) self.button.setStyleSheet(color_style) self.button1.setStyleSheet(color_style) self.button2.setStyleSheet(color_style) for a in range(num1): for b in range(num2): self.table.item(b,a).setBackground(QtGui.QColor(240,240,240)) self.setLayout(grid) self.setGeometry(600, 100, 850, 850) self.setWindowTitle('Review') self.show() #削除 def clickCallback(self): print(self.table.currentItem().text()) print(self.table.currentItem().row()) self.table.removeRow(self.table.currentItem().row()) #修正 def clickCallback1(self): print("なし") #終了 def clickCallback2(self): self.close() def main(): app = QApplication(sys.argv) ex = window() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
上記のコードに、オートコンプリート機能を追加しようと思います。
参考サイト
from PyQt5.QtWidgets import * import sys class Window(QWidget): def __init__(self): QWidget.__init__(self) layout = QGridLayout() self.setLayout(layout) names = ["Apple", "Alps", "Berry", "Cherry" ] completer = QCompleter(names) self.lineedit = QLineEdit() self.lineedit.setCompleter(completer) layout.addWidget(self.lineedit, 2, 2) app = QApplication(sys.argv) screen = Window() screen.show() sys.exit(app.exec_())
こちらを実装するために、
def initUI(self): 以下を追加してみましたが、うまくいきません。
def initUI(self): names = ["Apple", "Alps", "Berry", "Cherry" ] completer = QCompleter(names) # self.table.cellWidget.setCompleter(completer) # self.table.cell.setCompleter(completer) # self.table.setCompleter(completer) # self.table.item(1,0).setCompleter(completer)
色々と試してみましたが、AttributeError:が出て、存在しないとなります。
何卒、宜しくお願いいたします。
あなたの回答
tips
プレビュー