Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Qt for QTableView中使用自定义QProxy合并列?_Qt_Pyqt - Fatal编程技术网

如何在Qt for QTableView中使用自定义QProxy合并列?

如何在Qt for QTableView中使用自定义QProxy合并列?,qt,pyqt,Qt,Pyqt,我正在使用与某些QTableView关联的QSqlTableModel 我必须在我的QTableView中的同一列中显示firstName和secondName。 我还必须分别按这些字段进行搜索,这是一个问题:我不能只在SQL查询中使用CONCAT(lastName,,,secondName),我必须在某些数据结构中分别保留firstName和secondName class MainWindow(QMainWindow): def __init__(self): QMa

我正在使用与某些
QTableView
关联的
QSqlTableModel

我必须在我的
QTableView
中的同一列中显示
firstName
secondName
。 我还必须分别按这些字段进行搜索,这是一个问题:我不能只在SQL查询中使用
CONCAT(lastName,,,secondName)
,我必须在某些数据结构中分别保留
firstName
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)

现在,例如,我想按
secondName

对表进行排序,在表模型中创建您自己的数据结构

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;

};
用于在

按姓氏排序的示例:

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);
}
bool MyCustomeSortModel::lessThan(常数QModelIndex&oLeft,常数QModelIndex&oRight)常数
{
USER_FULLNAME sLeftData=sourceModel()->data(oLeft,Qt::UserRole).value();
USER_FULLNAME sRightData=sourceModel()->data(oRight,Qt::UserRole).value();
开关(oLeft.column()){
案例0://按姓氏排序
返回sLeftData.oLastNamedata(oLeft,Qt::DisplayRole)data(oRight,Qt::DisplayRole);
}

您能提供一些代码吗?您可以使用struct作为数据结构。或者我有一个
QSqlTableModel
,所以我想为它做一个代理。我可以从代理的
data
方法中获取
QModelIndex
,知道原始模型的列和行吗?对,
类MyCusumeModel:public QSqlTableModel
并重写
data
函数来处理表数据
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);
}