2017-11-19 2 views
0

과 연결된 QSqlTableModel을 사용하고 있습니다.QTableView 용 Qt에서 사용자 정의 QProxy를 사용하여 열을 병합하는 방법은 무엇입니까?

QTableView에 같은 열에 firstNamesecondName을 표시해야합니다. 내가 별도로 다음 필드로 검색을해야하고, 그게 문제입니다 : 난 그냥 내 SQL 쿼리에 CONCAT(lastName, ' ', secondName)를 사용할 수 없습니다, 내가

class MainWindow(QMainWindow): 
    def __init__(self): 
     QMainWindow.__init__(self) 

     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

     db = QSqlDatabase.addDatabase("QMYSQL") 
     db.setHostName("...") 
     db.setDatabaseName("...") 
     db.setUserName("...") 
     db.setPassword("...") 
     db.open() 

     model.setQuery(u"""SELECT 
         CONCAT(c.firstName, ' ', c.lastName, ' ', c.patrName), 
         CONCAT(c.birthDate, '/', TIMESTAMPDIFF(YEAR, c.birthDate, NOW())), 
         IF(c.sex = 1, 'M', 'F'), 
         CONCAT(p.serial, '-', p.number), 
         CONCAT(d.serial, '-', d.number)       
         FROM client AS c 
         JOIN clientpolicy AS p ON c.id = p.client_id 
         JOIN clientdocument AS d ON c.id = d.client_id""", db) 

     self.ui.patientsTableView.setModel(model) 

이제 별도로 일부 데이터 구조에 firstNamesecondName을 유지해야한다, 예를 들어, 나는 C에서 테이블 모델에

typedef struct sUserFullName 
{ 
    QString oFistName; 
    QString oLastName; 
}USER_FULLNAME; 
Q_DECLARE_METATYPE(USER_FULLNAME); 

class MyCusumeModel : public QSqlTableModel 
{ 
    Q_OBJECT 

private: 

    QList<USER_FULLNAME> m_oAllUsersNames; 

    const QString& GetFirstName(int row) const 
    { 
     return m_oAllUsersNames.at(row).oFistName; 
    } 
    const QString& GetLastName(int row) const 
    { 
     return m_oAllUsersNames.at(row).oLastName; 
    } 

    public: 

    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; 

}; 

핸들 컬럼 데이터를 자신의 데이터 구조를 만들기 secondName

+0

당신이 몇 가지 코드를 제공 할 수 있습니까? 데이터 구조체로 struct를 사용할 수 있습니다. 또는 [QPair] (http://doc.qt.io/qt-5/qpair.html) – Simon

답변

0

하여 테이블을 정렬 할 쪽 :

QVariant MyCusumeModel::data(const QModelIndex &index, int role) const 
{ 
    // Valid index ? 
    if (!index.isValid()) 
     return QVariant(); 

    // Validate size overflow. 
    if (index.row() >= m_oAllUsersNames.size()) { 
     return QVariant(); 
    } 

    // Handle column data 
    switch (index.column()) { 

    case 0: // Combine first + last Name 
    if (role == Qt::DisplayRole) 
     return QString("%1, %2").arg(GetFirstName(index.row())).arg(GetLastName(index.row())); 
    if (role == Qt::UserRole) 
     return m_oAllUsersNames(index.row()); // store data 
    break; 

    default: 
    break; 
} 
return QVariant(); 

} 

성을 기준으로 정렬 QSortFilterProxyModel

예에서 재정의 lessThan을 정렬 :

bool MyCustomeSortModel::lessThan(const QModelIndex &oLeft, const QModelIndex &oRight) const 
{ 
    USER_FULLNAME sLeftData = sourceModel()->data(oLeft, Qt::UserRole).value<USER_FULLNAME>(); 
    USER_FULLNAME sRightData = sourceModel()->data(oRight,Qt::UserRole).value<USER_FULLNAME>(); 

    switch (oLeft.column()) { 

    case 0: // Sort by last name 
     return sLeftData.oLastName < sRightData.oLastName; 
     break; 

    default: 
     break; 
    } 

    // Sort any other supported type 
    return sourceModel()->data(oLeft, Qt::DisplayRole) < sourceModel()->data(oRight, Qt::DisplayRole); 
} 
+0

나는'QSqlTableModel'을 가지고 있으므로 프록시를 만들고 싶습니다. –

+0

원래 모델의 열과 행을 알고 프록시의'data' 메소드에서'QModelIndex'를 얻을 수 있습니까? –

+0

오른쪽,'class MyCusumeModel : public QSqlTableModel' 및'data' 함수를 오버라이드하여 테이블 데이터를 처리합니다. – Simon

관련 문제