Fajnie, że umiesz budować takie zaawansowane interfejsami w Qt Designer.
W samym Designer nie ma możliwości wyklikania sobie innego zachowania klawisza "Tab". Możesz tylko modyfikować kolejność tabulacji. Domyślne zachowanie klawisza "Tab" to przemieszczanie się między polami formularza, elementami interfejsu, czy komórkami w przypadku "QTableWidget".
Zaprogramowanie zmiany zachowania klawisza "Tab" na komórkach widget "QTableWidget" nie jest zbyt skomplikowana, ale zrozumienie zależności i technik na tak skomplikowanym i rozbudowany panelu (GUI) jaki podałeś wprowadza sporo zamieszania i zajmuje duuużo czasu.
Początkowo na formatce stworzyły mi się dwie instancje "QTableWidget" o nazwie "table_error_free_coordinates" i nie będę ukrywał, że musiałem skorzystać z pomocy ChatGPT,
żeby zrozumieć różnice oraz zależności między klasą QWidget a klasą "ui" w tym przykładzie o nazwie "Ui_alignNMKDialogBase", obiektami a ich "parents" oraz "children".
poniżej zamieszczam Listing z docelowym zachowaniem klawisza "Tab" jaki chcesz osiągnąć
enjoy
Kopiuj
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCore import Qt
class ChangeBehaveKeyTab(QtWidgets.QTableWidget):
def __init__(self, rows, columns, parent=None, parent_ui=None):
super().__init__(rows, columns, parent)
self.setRowCount(rows)
self.setColumnCount(columns)
self.parent_ui = parent_ui
def keyPressEvent(self, event):
current_row = self.currentRow()
current_column = self.currentColumn()
if event.key() == Qt.Key.Key_Tab:
next_column = (current_column + 1) % self.columnCount()
next_row = current_row + (current_column + 1) // self.columnCount()
if next_row < self.rowCount():
self.setCurrentCell(next_row, next_column)
else:
self.parent_ui.add_new_row()
self.setCurrentCell(next_row, next_column)
event.accept()
else:
super().keyPressEvent(event)
class Ui_alignNMKDialogBase(object):
def setupUi(self, alignNMKDialogBase):
alignNMKDialogBase.setObjectName("alignNMKDialogBase")
alignNMKDialogBase.resize(937, 726)
self.gridLayout = QtWidgets.QGridLayout(alignNMKDialogBase)
self.gridLayout.setObjectName("gridLayout")
self.pushButton_calculate = QtWidgets.QPushButton(parent=alignNMKDialogBase)
self.pushButton_calculate.setObjectName("pushButton_calculate")
self.gridLayout.addWidget(self.pushButton_calculate, 0, 1, 1, 1)
self.pushButton_drawing_ellipses = QtWidgets.QPushButton(parent=alignNMKDialogBase)
self.pushButton_drawing_ellipses.setObjectName("pushButton_drawing_ellipses")
self.gridLayout.addWidget(self.pushButton_drawing_ellipses, 0, 3, 1, 1)
self.pushButton_help = QtWidgets.QPushButton(parent=alignNMKDialogBase)
self.pushButton_help.setObjectName("pushButton_help")
self.gridLayout.addWidget(self.pushButton_help, 0, 4, 1, 1)
self.tabWidget = QtWidgets.QTabWidget(parent=alignNMKDialogBase)
self.tabWidget.setTabPosition(QtWidgets.QTabWidget.TabPosition.West)
self.tabWidget.setObjectName("tabWidget")
self.tab_error_free_coordinates = QtWidgets.QWidget()
self.tab_error_free_coordinates.setObjectName("tab_error_free_coordinates")
self.gridLayout_3 = QtWidgets.QGridLayout(self.tab_error_free_coordinates)
self.gridLayout_3.setObjectName("gridLayout_3")
self.row_count = 1
self.column_count = 3
self.table_error_free_coordinates = ChangeBehaveKeyTab(rows=self.row_count, columns=self.column_count, parent=alignNMKDialogBase, parent_ui=self)
self.gridLayout_3.addWidget(self.table_error_free_coordinates, 0, 0, 1, 1)
item = QtWidgets.QTableWidgetItem()
self.table_error_free_coordinates.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.table_error_free_coordinates.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.table_error_free_coordinates.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.table_error_free_coordinates.setHorizontalHeaderItem(2, item)
self.tabWidget.addTab(self.tab_error_free_coordinates, "")
self.tab_lengths = QtWidgets.QWidget()
self.tab_lengths.setObjectName("tab_lengths")
self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_lengths)
self.gridLayout_4.setObjectName("gridLayout_4")
self.table_lengths = QtWidgets.QTableWidget(parent=self.tab_lengths)
self.table_lengths.setObjectName("table_lengths")
self.table_lengths.setColumnCount(10)
self.table_lengths.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
item.setText("Id")
self.table_lengths.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.table_lengths.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.table_lengths.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.table_lengths.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.table_lengths.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.table_lengths.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.table_lengths.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.table_lengths.setHorizontalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.table_lengths.setHorizontalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.table_lengths.setHorizontalHeaderItem(9, item)
self.gridLayout_4.addWidget(self.table_lengths, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab_lengths, "")
self.tab_angles = QtWidgets.QWidget()
self.tab_angles.setObjectName("tab_angles")
self.gridLayout_2 = QtWidgets.QGridLayout(self.tab_angles)
self.gridLayout_2.setObjectName("gridLayout_2")
self.table_angles = QtWidgets.QTableWidget(parent=self.tab_angles)
self.table_angles.setObjectName("table_angles")
self.table_angles.setColumnCount(11)
self.table_angles.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(9, item)
item = QtWidgets.QTableWidgetItem()
self.table_angles.setHorizontalHeaderItem(10, item)
self.table_angles.horizontalHeader().setMinimumSectionSize(49)
self.gridLayout_2.addWidget(self.table_angles, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab_angles, "")
self.tab_azimuths = QtWidgets.QWidget()
self.tab_azimuths.setObjectName("tab_azimuths")
self.gridLayout_5 = QtWidgets.QGridLayout(self.tab_azimuths)
self.gridLayout_5.setObjectName("gridLayout_5")
self.tableWidget = QtWidgets.QTableWidget(parent=self.tab_azimuths)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(10)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(9, item)
self.gridLayout_5.addWidget(self.tableWidget, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab_azimuths, "")
self.tab_coordinates_aligned = QtWidgets.QWidget()
self.tab_coordinates_aligned.setObjectName("tab_coordinates_aligned")
self.gridLayout_6 = QtWidgets.QGridLayout(self.tab_coordinates_aligned)
self.gridLayout_6.setObjectName("gridLayout_6")
self.table_coordinates_aligned = QtWidgets.QTableWidget(parent=self.tab_coordinates_aligned)
self.table_coordinates_aligned.setObjectName("table_coordinates_aligned")
self.table_coordinates_aligned.setColumnCount(10)
self.table_coordinates_aligned.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.table_coordinates_aligned.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.table_coordinates_aligned.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.table_coordinates_aligned.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.table_coordinates_aligned.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.table_coordinates_aligned.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.table_coordinates_aligned.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.table_coordinates_aligned.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.table_coordinates_aligned.setHorizontalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.table_coordinates_aligned.setHorizontalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.table_coordinates_aligned.setHorizontalHeaderItem(9, item)
self.gridLayout_6.addWidget(self.table_coordinates_aligned, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab_coordinates_aligned, "")
self.gridLayout.addWidget(self.tabWidget, 1, 0, 1, 6)
self.pushButton_report = QtWidgets.QPushButton(parent=alignNMKDialogBase)
self.pushButton_report.setObjectName("pushButton_report")
self.gridLayout.addWidget(self.pushButton_report, 0, 2, 1, 1)
self.textBrowser = QtWidgets.QTextBrowser(parent=alignNMKDialogBase)
self.textBrowser.setMinimumSize(QtCore.QSize(50, 50))
self.textBrowser.setMaximumSize(QtCore.QSize(16777215, 100))
self.textBrowser.setObjectName("textBrowser")
self.gridLayout.addWidget(self.textBrowser, 3, 0, 1, 6)
self.pushButton_about = QtWidgets.QPushButton(parent=alignNMKDialogBase)
self.pushButton_about.setObjectName("pushButton_about")
self.gridLayout.addWidget(self.pushButton_about, 0, 5, 1, 1)
self.pushButton_load_data = QtWidgets.QPushButton(parent=alignNMKDialogBase)
self.pushButton_load_data.setObjectName("pushButton_load_data")
self.gridLayout.addWidget(self.pushButton_load_data, 0, 0, 1, 1)
self.label = QtWidgets.QLabel(parent=alignNMKDialogBase)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 2, 0, 1, 1)
self.retranslateUi(alignNMKDialogBase)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(alignNMKDialogBase)
def add_new_row(self):
self.table_error_free_coordinates.insertRow(self.row_count)
for col in range(self.table_error_free_coordinates.columnCount()):
self.table_error_free_coordinates.setItem(self.row_count, col, QtWidgets.QTableWidgetItem())
self.row_count += 1
def retranslateUi(self, alignNMKDialogBase):
_translate = QtCore.QCoreApplication.translate
alignNMKDialogBase.setWindowTitle(_translate("alignNMKDialogBase", "Wyrównanie sieci płaskiej - MNK"))
self.pushButton_calculate.setText(_translate("alignNMKDialogBase", "Oblicz"))
self.pushButton_drawing_ellipses.setText(_translate("alignNMKDialogBase", "Szkic elips błędów"))
self.pushButton_help.setText(_translate("alignNMKDialogBase", "Pomoc"))
item = self.table_error_free_coordinates.verticalHeaderItem(0)
item.setText(_translate("alignNMKDialogBase", "1"))
item = self.table_error_free_coordinates.horizontalHeaderItem(0)
item.setText(_translate("alignNMKDialogBase", "Id"))
item = self.table_error_free_coordinates.horizontalHeaderItem(1)
item.setText(_translate("alignNMKDialogBase", "X"))
item = self.table_error_free_coordinates.horizontalHeaderItem(2)
item.setText(_translate("alignNMKDialogBase", "Y"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_error_free_coordinates), _translate("alignNMKDialogBase", "Współrzędne bezbłędne"))
item = self.table_lengths.horizontalHeaderItem(1)
item.setText(_translate("alignNMKDialogBase", "Od"))
item = self.table_lengths.horizontalHeaderItem(2)
item.setText(_translate("alignNMKDialogBase", "Do"))
item = self.table_lengths.horizontalHeaderItem(3)
item.setText(_translate("alignNMKDialogBase", "D"))
item = self.table_lengths.horizontalHeaderItem(4)
item.setText(_translate("alignNMKDialogBase", "md"))
item = self.table_lengths.horizontalHeaderItem(5)
item.setText(_translate("alignNMKDialogBase", "D wyrównane"))
item = self.table_lengths.horizontalHeaderItem(6)
item.setText(_translate("alignNMKDialogBase", "mD wyrównane"))
item = self.table_lengths.horizontalHeaderItem(7)
item.setText(_translate("alignNMKDialogBase", "v"))
item = self.table_lengths.horizontalHeaderItem(8)
item.setText(_translate("alignNMKDialogBase", "mv"))
item = self.table_lengths.horizontalHeaderItem(9)
item.setText(_translate("alignNMKDialogBase", "v/mv"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_lengths), _translate("alignNMKDialogBase", "Długości"))
item = self.table_angles.horizontalHeaderItem(0)
item.setText(_translate("alignNMKDialogBase", "Id"))
item = self.table_angles.horizontalHeaderItem(1)
item.setText(_translate("alignNMKDialogBase", "L"))
item = self.table_angles.horizontalHeaderItem(2)
item.setText(_translate("alignNMKDialogBase", "C"))
item = self.table_angles.horizontalHeaderItem(3)
item.setText(_translate("alignNMKDialogBase", "P"))
item = self.table_angles.horizontalHeaderItem(4)
item.setText(_translate("alignNMKDialogBase", "K"))
item = self.table_angles.horizontalHeaderItem(5)
item.setText(_translate("alignNMKDialogBase", "mk"))
item = self.table_angles.horizontalHeaderItem(6)
item.setText(_translate("alignNMKDialogBase", "K wyrównany"))
item = self.table_angles.horizontalHeaderItem(7)
item.setText(_translate("alignNMKDialogBase", "mK wyrównany"))
item = self.table_angles.horizontalHeaderItem(8)
item.setText(_translate("alignNMKDialogBase", "v"))
item = self.table_angles.horizontalHeaderItem(9)
item.setText(_translate("alignNMKDialogBase", "mv"))
item = self.table_angles.horizontalHeaderItem(10)
item.setText(_translate("alignNMKDialogBase", "v/mv"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_angles), _translate("alignNMKDialogBase", "Kąty poziome"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("alignNMKDialogBase", "Id"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("alignNMKDialogBase", "Od"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("alignNMKDialogBase", "Do"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("alignNMKDialogBase", "Az"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("alignNMKDialogBase", "mAz"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("alignNMKDialogBase", "Az wyrównany"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("alignNMKDialogBase", "mAz wyrównany"))
item = self.tableWidget.horizontalHeaderItem(7)
item.setText(_translate("alignNMKDialogBase", "v"))
item = self.tableWidget.horizontalHeaderItem(8)
item.setText(_translate("alignNMKDialogBase", "mv"))
item = self.tableWidget.horizontalHeaderItem(9)
item.setText(_translate("alignNMKDialogBase", "v/mv"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_azimuths), _translate("alignNMKDialogBase", "Azymuty"))
item = self.table_coordinates_aligned.horizontalHeaderItem(0)
item.setText(_translate("alignNMKDialogBase", "Id"))
item = self.table_coordinates_aligned.horizontalHeaderItem(1)
item.setText(_translate("alignNMKDialogBase", "Numer"))
item = self.table_coordinates_aligned.horizontalHeaderItem(2)
item.setText(_translate("alignNMKDialogBase", "X wyrównane"))
item = self.table_coordinates_aligned.horizontalHeaderItem(3)
item.setText(_translate("alignNMKDialogBase", "Y wyrównane"))
item = self.table_coordinates_aligned.horizontalHeaderItem(4)
item.setText(_translate("alignNMKDialogBase", "mX"))
item = self.table_coordinates_aligned.horizontalHeaderItem(5)
item.setText(_translate("alignNMKDialogBase", "mY"))
item = self.table_coordinates_aligned.horizontalHeaderItem(6)
item.setText(_translate("alignNMKDialogBase", "mP"))
item = self.table_coordinates_aligned.horizontalHeaderItem(7)
item.setText(_translate("alignNMKDialogBase", "a elipsy"))
item = self.table_coordinates_aligned.horizontalHeaderItem(8)
item.setText(_translate("alignNMKDialogBase", "b elipsy"))
item = self.table_coordinates_aligned.horizontalHeaderItem(9)
item.setText(_translate("alignNMKDialogBase", "Az elipsy"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_coordinates_aligned), _translate("alignNMKDialogBase", "Współrzędne wyrównane"))
self.pushButton_report.setText(_translate("alignNMKDialogBase", "Raport pdf"))
self.textBrowser.setHtml(_translate("alignNMKDialogBase", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Noto Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Tu będą komunikaty z programu</p></body></html>"))
self.pushButton_about.setText(_translate("alignNMKDialogBase", "O programie"))
self.pushButton_load_data.setText(_translate("alignNMKDialogBase", "Wczytaj dane"))
self.label.setText(_translate("alignNMKDialogBase", "Komunikaty programu:"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
alignNMKDialogBase = QtWidgets.QDialog()
ui = Ui_alignNMKDialogBase()
ui.setupUi(alignNMKDialogBase)
alignNMKDialogBase.show()
sys.exit(app.exec())
R7YM