Q: Дать названия колонкам columnCount (PyQT5) С помощью конструкции if-else мне нужно дать определённые названия для колонок в tableView.
def columnCount(self, parent=None, *args, **kwargs):
        return 3

Собственно, насколько я понимаю данная задача решается в следующем методе:
def headerData():

И если первый def лишь выдаёт нужное количество колонок, то второй headerData() можно использовать для наименования этих колонок, но сейчас я не могу разобраться, каким образом это нужно оформить.
Спасибо.  

A: Собственно, получилось следующим образом. 
 def columnCount(self, parent=None, *args, **kwargs):
        return 3 #Количество колонок

 def headerData(self, section, orientation, role=None):
    if role == QtCore.Qt.DisplayRole:
        if orientation == QtCore.Qt.Horizontal:
            return ["1", "2", "3"][section]


A: Попробуйте пример ниже:
import sys
from PyQt5.QtGui     import *
from PyQt5.QtCore    import *
from PyQt5.QtWidgets import *

class Person(object):
    def __init__(self, name, city, c3): 
        self.name = name
        self.city = city
        self.c3   = c3 

class PersonDisplay(QMainWindow):
    def __init__(self, parent=None):
        super(PersonDisplay,self).__init__(parent)
        self.setWindowTitle('Person City')
        self.setGeometry(400, 100, 600, 415)  

        view = QTableView()
        view.verticalHeader().hide()                     
        view.setAlternatingRowColors(True)    
        view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) 

        tableData = PersonTableModel()
        view.setModel(tableData)
        self.setCentralWidget(view)

        for i in range(10000):
            tableData.addPerson(Person('Вася', 'Пупград',   '21'))   
            tableData.addPerson(Person('Соня', 'Париж',     '25')) 
            tableData.addPerson(Person('Kiril','Kirilgrad', '33')) 


class PersonTableModel(QAbstractTableModel):
    # количество строк для начального отображения таблицы 
    # и размера партии последующего обновления для просмотра.
    ROW_BATCH_COUNT = 150                                      

    def __init__(self):
        super(PersonTableModel, self).__init__()
        self.persons    = []
        self.rowsLoaded = self.ROW_BATCH_COUNT

    # Метод rowCount адаптирован так, что количество строк показывает количество строк, 
    # которые были загружены в настоящее время.       
    def rowCount(self, index=QModelIndex()):
        if not self.persons:
            return 0

        if len(self.persons) <= self.rowsLoaded:
            return len(self.persons)
        else:
            return self.rowsLoaded     

    # Метод canFetchMore возвращает True, если число загруженных строк меньше количества 
    # экземпляров человека, что указывает что есть больше данных, которые необходимо отобразить.
    def canFetchMore(self, index=QModelIndex()):
        if len(self.persons) > self.rowsLoaded:
            return True
        else:
            return False

    # Метод fetchMore запускается в случаях, когда canFetchMore возвращает True и 
    # в этом номере метода загружаемых строк увеличивается с помощью ROW_BATCH_COUNT
    def fetchMore(self, index=QModelIndex()):
        reminder     = len(self.persons) - self.rowsLoaded
        itemsToFetch = min(reminder, self.ROW_BATCH_COUNT)
        self.beginInsertRows(QModelIndex(), 
                             self.rowsLoaded, 
                             self.rowsLoaded+itemsToFetch-1)
        self.rowsLoaded += itemsToFetch
        self.endInsertRows()

    def addPerson(self, person):
        self.beginResetModel()
        self.persons.append(person)
        self.endResetModel()

    def columnCount(self,index=QModelIndex()):
        return 3   

    def data(self,index,role=Qt.DisplayRole):
        col = index.column()
        person = self.persons[index.row()]
        if role == Qt.DisplayRole:
            if col == 0:
                return QVariant(person.name)
            elif col == 1:
                return QVariant(person.city)
            elif col == 2:                     
                return QVariant(person.c3)
            return QVariant()

    def headerData(self, section, orientation, role=Qt.DisplayRole):      # <===========
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:       
            if section == 0:
                return QVariant("Имя") 
            elif section == 1:
                return QVariant("город проживания")    
            elif section == 2:
                return QVariant("Что-то еще") 
        else:
            return QVariant()


if __name__ == "__main__": 
    app    = QApplication(sys.argv)
    appWin = PersonDisplay()
    appWin.show()
    app.exec_()


