如何在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);
}