Fokus automatisch nach Start von Tabellenausgabe

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Nobuddy
User
Beiträge: 833
Registriert: Montag 30. Januar 2012, 16:38

Freitag 24. Mai 2019, 14:23

Hallo zusammen,

ich möchte, dass gleich nach dem Starten des Fensters (Tabellenausgabe), der Focus auf die erste Zeile der Tabelle gesetzt wird, ohne Betätigen der Maus bzw. Tastatur.
Trotz intensivem Googeln, habe ich keine Lösung gefunden.
Ich hoffe Ihr könnt mir dabei weiterhelfen!

Ich habe dazu hier einen lauffähigen Code, den Ihr dazu verwenden könnt, um mir zu helfen.

Grüße Nobuddy

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# For Python3.x

import sys
import operator  # used for sorting
from PyQt5 import QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtWidgets import (QMainWindow, QMdiArea, QWidget, QTableView,
    QAbstractItemView, QGridLayout, QApplication)


title = 'Backlight management'
header = ['Pos', 'Supplier', 'Artikel', 'Benennung']
table = [['001', 'Meyer', '47110', 'Bratwurst weiss, 125 g / Stück, 50% Schweinefleisch, 50% Rindfleisch'],
    ['002', 'Meyer', '47110', 'Bratwurst weiss, 125 g / Stück, 50% Schweinefleisch, 50% Rindfleisch'],
    ['003', 'Meyer', '47110', 'Bratwurst weiss, 125 g / Stück, 50% Schweinefleisch, 50% Rindfleisch']]
columnWidths = [20, 30, 40, 400]


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("MDI demo")
        self.mdi_area = QMdiArea()
        self.setCentralWidget(self.mdi_area)
        self.mdi_area.tileSubWindows()
        title = 'TEST'
        self.list_model = 'listinlist'
        sub = Table(self, title, table, header, columnWidths)
        self.mdi_area.addSubWindow(sub)
        sub.show()


class Table(QWidget):
    def __init__(self, parent, title, dataList, header, columnWidths):
        QWidget.__init__(self)
        self.parent = parent
        self.title = title
        self.old_data = self.mylist = self.dataList = sorted(dataList)
        self.header = header
        self.columnWidths = columnWidths
        self.mdi_area = parent.mdi_area
        self.setWindowTitle(self.title) 
        self.old_data_counter = len(self.dataList)
        if self.old_data_counter == 0:
            print('Keine Daten vorhanden!')
            return
        self.installEventFilter(self)
        self.view = QTableView()
        self.model = TableModel(self, self.dataList, self.header)
        self.update_table()
        self.headerSize(parent)
        # GridLayout
        grid = QGridLayout() 
        grid.addWidget(self.view, 0, 0)
        self.setLayout(grid) 

    def updateGeometryAsync(self):
        QtCore.QTimer.singleShot(0, self.updateGeometry)

    def headerSize(self, parent):
        """
        Build header- and columnsize
        """

        view = self.view
        model = self.model
        view.setModel(model)
        view.resizeColumnsToContents()
        view.resizeRowsToContents()
        view.setWordWrap(True)

    def update_table(self):
        # ... when a row header label changes and makes the
        # width of the vertical header change too       
        self.model.headerDataChanged.connect(self.updateGeometryAsync)
        self.view.setModel(self.model)
        # enable sorting
        self.view.setSortingEnabled(True)
        self.view.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.old_data_counter = len(self.mylist)
        self.mdi_area.adjustSize()


class TableModel(QtCore.QAbstractTableModel):
    """
    Build table
    """

    def __init__(self, parent, mylist, header, *args):
        QtCore.QAbstractTableModel.__init__(self, parent, *args)
        self.mylist = mylist
        self.header = header

    def rowCount(self, parent):
        return len(self.mylist)

    def columnCount(self, parent):
        return len(self.mylist[0])

    def data(self, index, role):
        if not index.isValid() or role != QtCore.Qt.DisplayRole:
            return None
        return self.mylist[index.row()][index.column()]

    def headerData(self, col, orientation, role):
        if (orientation == QtCore.Qt.Horizontal
                and role == QtCore.Qt.DisplayRole):
            return self.header[col]
        return None

    def sort(self, col, order):
        """
        Sort table by given column number col
        """

        self.layoutAboutToBeChanged.emit()
        self.mylist = sorted(self.mylist,
            key=operator.itemgetter(col))
        if order == QtCore.Qt.DescendingOrder:
            self.mylist #.reverse()
        self.layoutChanged.emit()

    def output_list(self):
        return self.mylist

def main():
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
Nobuddy
User
Beiträge: 833
Registriert: Montag 30. Januar 2012, 16:38

Freitag 24. Mai 2019, 15:07

Habe jetzt doch noch die Lösung selbst gefunden!

Bei Funktion 'update_table', habe ich das am Ende noch hinzu gefügt:

Code: Alles auswählen

        index = self.view.model().index(0, 1)
        self.view.setCurrentIndex(index)
Damit funktioniert es nun so wie gewünscht. :P
Antworten