#include "attributeView.h" #include "attributeTableDelegate.h" #include "multiLineHeaderView.h" //#include "sqlQueryExecutor.h" #include "dataSyncManager.h" #include #include #include AttributeView::AttributeView(const ModelAttributeGroup& modelAttributeGroup, QWidget* parent, const QString& connection, const QString& tableName) : QWidget(parent) , m_connection(connection) , m_attributeTable(tableName) , m_modelAttributeGroup(modelAttributeGroup) { //需要进行数据同步,因此从PublicGroupSyncManager中统一获取数据 m_attributeGroup = DataSyncManager::instance().getGroup(m_modelAttributeGroup.groupID); m_tableView = new QTableView(this); m_tableView->setStyleSheet("QTableView::item{padding-left:5px;} QTableView::item:selected{border:1px solid rgb(70,130,180);}"); m_tableView->verticalHeader()->setVisible(false); m_tableView->setTabKeyNavigation(false); //关闭tab键导航,对自定义Eidtor设置焦点时(比如lineEdit)会触发tab键,目前尚未清楚为什么 m_tableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed); //禁用自动触发编辑的所有方式(自定义代理中按要求实现,这里是双击和空格) m_attributeTableModel = new AttributeTableModel(m_modelAttributeGroup, this, m_connection, m_attributeTable); m_tableView->setModel(m_attributeTableModel); m_attributeTableModel->setSelectionModel(m_tableView->selectionModel()); //注意selectionModel()一定要在视图setModel后,否则返回的是空指针 m_attributeTableDelegate = new AttributeTableDelegate(m_tableView, m_connection, m_tableView); m_tableView->setItemDelegate(m_attributeTableDelegate); //自定义表头 m_multiLinHeader = new MultiLineHeaderView(Qt::Horizontal, this); QColor bg(40, 40, 40); QColor border(30, 30, 30); m_multiLinHeader->setBackgroundColor(bg); m_multiLinHeader->setBorderColor(border); //主标题加粗展示 for(int i =0; i < m_attributeTableModel->columnCount(); i++) { HeaderLineStyle mainTitleStyle; mainTitleStyle.font.setBold(true); m_multiLinHeader->setSectionLineStyle(i, 0, mainTitleStyle); HeaderLineStyle subTitleStyle; //subTitleStyle.font.setPointSize(8); m_multiLinHeader->setSectionLineStyle(i, 1, subTitleStyle); } m_tableView->setHorizontalHeader(m_multiLinHeader); //除了第一列其余列恢复可以手动调整模式,并根据外部承载容器的宽度调整section QTimer::singleShot(1000, this, [=](){ int containerWidth = this->width() - 100; int totalSize = m_multiLinHeader->length() - m_multiLinHeader->sectionSize(0); for(int i = 1; i < m_multiLinHeader->count(); i++) { //恢复手动调整模式 m_multiLinHeader->setSectionResizeMode(i, QHeaderView::Interactive); //根据比例计算每个section应当对应的大小 /*double ratio = m_multiLinHeader->sectionSize(i) / (double)totalSize; int size = containerWidth * ratio; m_multiLinHeader->resizeSection(i, size);*/ } }); m_vLayout = new QVBoxLayout(this); m_vLayout->setSpacing(0); m_vLayout->setContentsMargins(0, 0, 0, 0); m_vLayout->addWidget(m_tableView); this->setLayout(m_vLayout); } AttributeView::~AttributeView() {} void AttributeView::active() { if(m_attributeGroup.isPublic && m_attributeGroup.version != DataSyncManager::instance().getGropuVersion(m_attributeGroup.id)) { //提示强制刷新 emit showMessage(type_information, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"该属性组为公共组,检测到数据发生更新,需要进行强制刷新")); m_attributeTableModel->forceRefresh(); m_attributeGroup.version = DataSyncManager::instance().getGropuVersion(m_attributeGroup.id); } else m_attributeTableModel->triggerSyncSignal(); } void AttributeView::setEditable(bool editable) { if(editable) m_tableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed); else m_tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); } void AttributeView::syncChangeRecord() { if(m_attributeGroup.isPublic) { m_attributeGroup.version++; DataSyncManager::instance().syncGroupVersion(m_attributeGroup.id, m_attributeGroup.version); } }