图头框架优化,支持居中显示,上下拖拉放大范围

This commit is contained in:
jiayulong 2025-11-11 09:02:49 +08:00
parent 8dcd7dd211
commit cf80a84c9e
19 changed files with 6211 additions and 102 deletions

View File

@ -0,0 +1,167 @@
/**
* @file CStringTyle.h
* @brief CString数据自定义
* @date 2014-10-10
* @author: ZhouWenfei
*/
#ifndef PAI_FRAME_CSTRING_H__
#define PAI_FRAME_CSTRING_H__
#pragma once
#include <iostream>
#include <QString>
#include <QMessageBox>
#include <QDialogButtonBox>
#include <QDialog>
#include <QFormLayout>
#include <QTextEdit>
#include <QDialogButtonBox>
#include <QFormLayout>
#include <QPushButton>
#include <stdio.h>
#include <limits.h>
#pragma execution_character_set("utf-8")
#pragma warning( push ,0)
//#include "BaseFunExport.h"
#pragma warning( pop )
//#ifdef MessageBox
//#define MessageBox MessageBox
//#endif
#define MAX_PATH 1024
//#define _MAX_PATH 1024
#define MaxCurve 1024
#define curve_name_len 256
#define curve_unit_len 256
#define MIN_RANK rank_char
#define MAX_RANK rank_longlong
#define INTMAX_RANK rank_longlong
#define SIZE_T_RANK rank_long
#define PTRDIFF_T_RANK rank_long
#define MB_OK QMessageBox::Ok
typedef unsigned short WORD;
#ifdef WIN32
typedef unsigned long DWORD;
typedef DWORD *LPDWORD;
typedef void *HANDLE;
#else
typedef unsigned int DWORD;
typedef DWORD *LPDWORD;
typedef void *HANDLE;
#endif
typedef unsigned char BYTE;
typedef char* LPSTR;
typedef void* LPVOID;
class CString;
typedef QList<CString> CStringList;
using namespace std;
//#define REPR_INT 1
//#define REPR_SHORT 2
//#define REPR_LONG 3
//#define REPR_FLOAT 4
//#define REPR_DOUBLE 5
//#define REPR_STRING 6
//#define REPR_CHAR 7
//#define REPR_UCHAR 8
//#define REPR_USHORT 9
//#define REPR_UINT 10
//#define REPR_ULONG 11
//class BASEFUN_EXPORT CString;
//构建CString
class CString
{
public:
CString(const char *str = nullptr);
CString(const QString str);
CString(const CString &other);
~CString();
int GetLength()const;
int Find(char *str);
int Find(char str);
int Find(CString &another);
int Find(char str[],int start);
int ReverseFind(char ch);
int Insert(int pos ,const CString Sctr);
int Replace(const char *Src,const char *Dest);
CString & TrimLeft();
CString & MakeUpper();
CString& MakeLower();
CString & TrimRight();
bool operator==(const char* other );
bool operator!=(const char* other );
bool operator==(const CString& other );
bool operator!=(const CString& other );
char operator[](int i);
CString Right(int count)const;
CString Left(int count)const;
// CString operator = (const QString& SrcStr) ;
CString operator + (const CString& SrcStr) ;
CString operator += (CString& SrcStr) ;
CString operator += (const CString& SrcStr) ;
char* GetString()const;
char GetChar(int n);
char GetAt(int n);
CString Mid(int pos,int count)const;
CString Mid(int pos)const;
void Format(const char *format,...);
void Delete(int fromIndex,int length);
// const char *m_temp;
void Alloc(int len);
void Empty();
private:
QString m_data;
};
enum flags {
FL_SPLAT0 = 0x00,/* Drop the value, do not assign */
FL_SPLAT = 0x01,/* Drop the value, do not assign */
FL_INV = 0x02,/* Character-set with inverse */
FL_WIDTH = 0x04,/* Field width specified */
FL_MINUS = 0x08,/* Negative number */
};
enum ranks {
rank_char = -2,
rank_short = -1,
rank_int = 0,
rank_long = 1,
rank_longlong = 2,
rank_ptr = INT_MAX/* Special value used for pointers */
};
enum bail {
bail_none = 0,/* No error condition */
bail_eof,/* Hit EOF */
bail_err/* Conversion mismatch */
};
int AfxMessageBox(CString str);
int MessageBox(QWidget *parent,char lpText[128],char*lpCaption, int UINTuType);
void ShowMessage(QString mess);
//构建AfxMessageBox()函数
//extern int BASEFUN_EXPORT AfxMessageBox(CString str);
//extern int BASEFUN_EXPORT MessageBox(QWidget *parent,char lpText[128],char*lpCaption, int UINTuType);
// using namespace pai::graphics;
#endif

View File

@ -0,0 +1,192 @@
#ifndef PAI_FRAME_ICONSOLE_PAITABLEWIDGET_H
#define PAI_FRAME_ICONSOLE_PAITABLEWIDGET_H
#include <QTableWidget>
#include <QContextMenuEvent>
#include <QAction>
#include <QCheckBox>
namespace pai
{
namespace gui
{
//class PaiCheckBox;
/**
* @class PaiTableWidget
* @brief PaiTableWidget P.A.I系统定制发布的表格控件
*/
class PaiTableWidget : public QTableWidget
{
Q_OBJECT
public:
PaiTableWidget(QWidget* pParent = NULL);
virtual ~PaiTableWidget();
/**
* @brief
* @param[in] ok
* @param[in] maxRowCount
*/
void SetAutoHeight(const bool ok, const int maxRowCount = 10);
/**
* @brief
* @param[in] rowIndex
* @param[in] count ,
*/
void RemoveRows(const int rowIndex, const int count);
/**
* @brief
*/
void RemoveRows();
/**
* @brief
* @param[in] hor 线
* @param[in] ver 线
*/
void setShowGrid(bool hor, bool ver);
/**
* @brief
* @param msg
*/
void ShowPromptMessage(const QString &msg);
/**
* @brief
* @param str
*/
void SetFilterEmptyMessage(const QString &str);
/**
* @brief
* @param[in] selectable
*/
void SetColumnVisibleSelectable(bool selectable);
/**
* @brief
* @param[in] columnList
*/
void SetUnselectableColumns(const QStringList& columnList);
/**
*@brief
*/
void RecallMemberedSections();
/**
* @brief ,CheckBox.()
* @param[in] logicalIndex
* @param[in] checkable
* @param[in] pCheckBox CheckBoxcheckable为false
*/
void SetColumnCheckable(const int logicalIndex, const bool checkable, QCheckBox *pCheckBox = NULL);
public slots:
/**
* @brief
* @param[in] keyword
* @param[in] col
*/
void Filter(const QString & keyword, int col = 0);
/**
* @brief
* @param[in] keyword
* @param[in] cols
*/
void Filter(const QString & keyword, QList<int> cols);
/**
* @brief 使HeaderView的CheckBox
* @param[in] column
*/
void insertColumn(int column);
/**
* @brief 使HeaderView的CheckBox
* @prama[in] column
*/
void removeColumn(int column);
private:
/**
*@brief
*/
void RememberCurrentSections();
protected:
/**
* @brief
* @param[in] rowIndex
* @return
*/
virtual bool Filter(int rowIndex);
/**
* @brief
*/
void paintEvent(QPaintEvent *event);
/**
* @brief
*/
void contextMenuEvent(QContextMenuEvent *event);
/**
* @brief
*/
void keyPressEvent(QKeyEvent *event);
private slots:
/**
* @brief
*/
void ResetTableHeight();
/**
* @brief
*/
void RowCountChanged();
/**
* @brief
*/
void setClipboard();
/**
* @brief
* @param[in] pItem
*/
void TableItemChanged(QTableWidgetItem *pItem);
private:
bool m_AutoHeight;
bool m_ShowFilterEmptyMsg;
int m_AutoHeightMaxRowCount;
QString m_MsgWhileFilterEmpty;
QString m_PromptMsg;
QList<int> m_FilterCols; // 最近一次过滤的的列
protected:
QString m_FilterKeyword; // 最近一次过滤的关键字
signals:
/**
* @brief
* @param count
*/
void RowCountChanged(const int count);
};
}
}
#endif /* PAITABLEWIDGET_H_ */

View File

@ -0,0 +1,71 @@
#ifndef ASSETCOPY_H
#define ASSETCOPY_H
#include <QObject>
#include <QMenu>
#include <QTableWidget>
#include <QTableWidgetSelectionRange>
#include <QCache>
// #include "ObjWellLogWavefile.h"
#include "ObjWellLog.h"
#include "adapter_defs.h"
class AssetCopy : public QObject
{
Q_OBJECT
public:
AssetCopy(QObject *parent=NULL);
~AssetCopy();
void initPopMenu(QTableWidget *pTable, QMenu *pmenu = NULL);
void setDataType(DType type);
void reqCustomComtextMenu(const QPoint &pos);
QString itemParseText(int row,int col);
void setVerScrollValue(int value);
void setHorScrollValue(int value);
void restParse();
bool isParse();
void SetWellLogs(DType type1,QList<CObjWellLog*>&pWellLogs);
public slots:
void onCopyData();
void onParseData();
void onCopyLinesData();
void onCopyColnumsData();
signals:
void signalReqCustomContextMenu(const QPoint& point);
void signalParseData(const QTableWidgetSelectionRange &parseRange);
void saveToTempModel();
void needANewLine(int);
private slots:
void onCustomContextMenuRequested(const QPoint& pos);
private:
QString itemText(int row,int col);
void changeCacheRowCol(int orgRow,int orgCol,int movRow,int movCol);
private:
//////////////////<2F><EFBFBD><E9B8B4><><D5B3>//////////////////
QByteArray seriseSelectRange(const QTableWidgetSelectionRange& selectRange);
QTableWidgetSelectionRange deseriseSelectRange( QByteArray& selectByte);
//ճ<><D5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void parseData(const QTableWidgetSelectionRange& parse);
void cacheGridData(const QTableWidgetSelectionRange& m_selectionRange);
private:
///////////////////<2F><><EFBFBD><EFBFBD><><D5B3>////////////
QMenu* m_menu;
static AssetCopy *p_assCopy;
QMap<int,QMap<int,QString> > m_cacheData;
QMap<int,QMap<int,QString> > m_parseCacheData;
bool m_isParse;
int m_verScrolValue;
int m_horScrolValue;
QList<CObjWellLog*>m_pWellLogs;
DType type;
};
#endif // ASSETCOPY_H

View File

@ -0,0 +1,334 @@
#ifndef GRIDDATAADAPTER_H
#define GRIDDATAADAPTER_H
#include "CStringType.h"
#include <QObject>
#include <QVariant>
#include <QList>
#include <QPair>
#include <QAbstractTableModel>
#include <QMultiMap>
#include <QRunnable>
#include <QEvent>
#include <QPaintEvent>
#include <QFutureWatcher>
#include <QMouseEvent>
#include <QScrollBar>
#include <QHeaderView>
#include <PaiTableWidget.h>
#include <QTableWidgetSelectionRange>
#include <QMutex>
#include <QMenu>
#include <QApplication>
#include "BaseFun.h"
// #include "ObjCoreImage.h"
#include "GeometryUtils.h"
// #include "ObjWellLogWavefile.h"
#include "ObjWelllog.h"
#include "LogIO.h"
// #include "CurveLineLog.h"
// #include "ObjWelllogTABLE.h"
// #include "ObjWelllogTDT.h"
// #include "ObjWelllogFMT.h"
#include "DepthProgress.h"
#include "adapter_defs.h"
/**
* @file GridDataAdapter.h
* @date 2020/03/02
* @auto luol add
*
*/
using namespace pai::datamodel;
using namespace pai::gui;
class QTableWidgetItem;
class CDataManagger;
class TipPop;
class AssetCopy;
class WellLogHeaderView:public QHeaderView
{
Q_OBJECT
public:
WellLogHeaderView(Qt::Orientation orientation=Qt::Horizontal, QWidget *parent = 0);
~WellLogHeaderView();
signals:
void signalClickedSectionLogicalIndex(int logincalIndex);
//void setSelectionChecked(const QModelIndex &index);
protected:
void mouseReleaseEvent(QMouseEvent *evt);
void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;
void paintEvent(QPaintEvent *pevt);
private:
int m_logicalIndex;
};
class TableModel : public QAbstractTableModel
{
public:
TableModel(QObject* parent=NULL);
// QAbstractItemModel interface
public:
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
QStringList tableHeaderData();
void setModelData(const QList< QList<DataPair> > &model );
void setTableHeaderData(const QStringList &headerLst);
void clearBuffer();
void clearHeader();
private:
QList< QList<DataPair> > m_dataBuffer;
QStringList m_headerData;
};
class GridDataAdapter : public QObject
{
Q_OBJECT
public:
typedef void (GridDataAdapter::*pChangeComplete)();
GridDataAdapter(QTableWidget* table,QScrollBar *horizontalScrollBar,QScrollBar *verticalScrollBar,QObject* parent=NULL);
~GridDataAdapter();
void setModelData(const QList< QList<DataPair> > &model);
void setTableHeaderData(const QStringList &headerLst);
//清空缓存
void clearBuffer();
//设置总行数
void setRowCount(int rowCount);
//设置总列数
void setColCount(int colCount);
//绑定数据并初始数据
void bindData();
void initWellData(DType type,CObjWell* pwell);
void updateWellData();
void initWellLogData(DType type,QList<CObjWellLog*> WellLogs);
void updatetWellLogData();
void initMultWellLogData(DType type,QList<CObjWellLog*> WellLogs);
void initFMTWellLogData(DType type,QList<CObjWellLog*> WellLogs);
void initTDTWellLogData(DType type,QList<CObjWellLog*> WellLogs);
void updatetMultWellLogData();
void updatetTDTWellLogData();
void updatetFMTWellLogData();
void initTableWellLogData(DType type,QList<CObjWellLog*> WellLogs);
void updatetTableWellLogData();
void addActonMenu(int type);
void ReFreshWindow(int type);
int dataRowCount();
int dataColCount();
void CommitToSave();
//导出数据
bool tableToCSVFile();
bool dataInfoHeader(CLogIO *logio,QStringList &fieldList,QString &wellName,int &rowCount);
//导入数据
bool importToFile();
void switchLogView(bool isSwitch);
void reqCustomComtextMenu(const QPoint &pos);
void ReFreshDisplayCurve();
int getRecordCount();
protected:
virtual bool eventFilter(QObject *pSender, QEvent * pEvent) override;
public:
DType m_dtype;
int m_middleWidth;
int m_gridWidth;
signals:
void signalCommitToSave();
void signalReqCustomContextMenu(const QPoint &pos);
public slots:
void onDeleteLinesData();
void addALine_SLOT();
void addALine_SLOT(int);
void sortSequence_SLOT();
void sortCompute_SLOT();
private slots:
void slotVerScrollValueChange(int value);
void slotHorScrollValueChange(int value);
void slotScrollChangeComplete();
void slotCellDoubleClicked(int row,int col);
void slotCellClicked(int row,int col);
//保存
void slotCommitToSave();
//void slotModelDataComplete(DType type,const QList< QList<DataPair> >& dataBuffer);
void slotVerScrollBarPressed();
void slotVerScrollBarReleased();
void slotHorScrollBarPressed();
void slotHorScrollBarReleased();
//
void slotSectionClicked(int logincIndex);
void onParseData(const QTableWidgetSelectionRange &parseRange);
void refreshTempModel_SLOT();
void itemChange_SLOT(int, int);
private:
bool VerScrollUp;
bool VerScrollChanged;
int DefRowHeight;
int DefColWidth;
void initColWH();
bool haveDoubleClicked;
void buildItemList();
bool isCellChanged();
//更新缓存数据并刷新视图
void updateTableView();
//滚动刷新
void valueChange();
//计算行列
void calcuPageRowsCols();
//重置编辑范围
void resetEditRange();
//更新pagerow
void calNewPageRow();
//保存井数据 数据行
void saveWellData(QList<QList<double> > data,QList<int> modifyRows);
//提取井数据
void extractWellData(QList<QList<double> > &editData,QList<int> &modifyRows ,bool &isScuccess);
void getWellData(int row,int col,QList<double>& wellXYZ,bool& covSuccss);
//保存曲线数据
void saveWellLogData(QList<QList<float> > depthList);
void fillDefaultTitle(QStringList& fields,int pageCol);
//提取曲线数据
void extractWellLogData(QList<QList<float> > &editData ,bool &isScuccess);
////////////////////////////////////////////////////
//保存波列数据
void saveMultWellLogData(bool &isScuccess);
//提取波列数据
//void extractMultWellLogData(int &row,int &col,float &value,bool &isScuccess);
void extractMultWellLogData(QList<QList<float> > &editData,bool &isScuccess);
//////////////////////////////////////////////////
//保存表
void saveTableWellLogData(bool &isScuccess);
//导入表格数据
void importTableWellLogData(QFile &importFile);
//导出井眼轨迹数据
void exportWellData(FILE *fp, DepthProgress& process);
//导出曲线数据
void exportWellLogData(FILE *fp, DepthProgress& process);
//导入曲线数据
void importWellLogData(QFile &importFile, DepthProgress& process);
//导出多维数据
void exportMultWellLogData(FILE *fp, DepthProgress& process);
//导出表格数据
void exportTableWellLogData(FILE *fp, DepthProgress& process);
//获取头信息行列
bool getRowsColumnsByHeader(QFile &importFile,int &rows,int &columns,QString &contentLine);
float getData(int repCode,char *buffer);
void setData(int repCode,char *buffer,double yy);
//附加曲线统计、属性编辑、计算视图
void attachWellLogView();
void hideWellLogView();
void bindWellLogData(int wellLogIndex);
//更新临时存储
void refreshTempModel();
//插入一行
void addALine(int);
private:
int m_pageRow;
int m_pageCol;
int m_dataRowCount;
int m_dataColCount;
int *itemWidth;//单元格宽度
bool ifItemWidth;
int m_verScrolValue;
int m_horScrolValue;
QScrollBar *m_verScrolBar;
QScrollBar *m_horScrolBar;
PFLOATPROPERTY *m_MutiVM;
// CObjWellLogWavefile *m_pWave;
// CObjWellLogTDT *m_pTDT;
// CObjWellLogFMT *m_pFMT;
QList<QTableWidgetItem*> m_pageItems;
QTableWidget* m_table;
TableModel* m_tmodel;
//////////////initWellData///////////////////////////
CObjWell* m_pWell;
//////////////initWellLogData///////////////////////////
QStringList m_TitleField;
QList<CObjWellLog*> m_pWellLogs;
PFLOATPROPERTY **vP;
////////////////////initTableWellLogData////////////////////////////////
int recordcount;
//修改后的行列值
QMultiMap<int ,int> modifyRowCols;
private:
QString fileName;
QString curveName;
int StartDepth;
int EndDepth;
int StartDim;
int EndDim;
///
int DepLevel;
float m_SDep;
float m_EDep;
float m_Rlev;
int m_nSamples;
int m_flRlev2;
int m_PointNum;
int m_RepCode;
int m_CodeLen;
int m_SamplePoint;
private:
QFutureWatcher<void> watcher;
QMutex m_mutex;
pChangeComplete m_pComplete;
//记录编辑选中范围
QTableWidgetSelectionRange m_editRange;
//用于比较是否修改判定字符
QString m_cellText;
CDataManagger *m_mgr;
TipPop *m_popTip;
bool m_switch;
int m_nVerScrollValue;
AssetCopy* m_pAssetCopy;
QMenu *m_menu;
bool canLoadFromSLF;
FLOATPROPERTY tempdata;
};
#endif // GRIDDATAADAPTER_H

View File

@ -0,0 +1,324 @@
#include "CStringType.h"
#include <QLabel>
char *m_temp=NULL;
CString::CString(const char *str)
{
m_temp=NULL;
if(str==NULL)
m_data ="";
else
m_data=QString::fromLocal8Bit(str);
}
CString::CString(const QString str)
{
m_temp=NULL;
if(str==NULL)
m_data ="";
else
m_data=str;
}
CString::~CString()
{
if(m_temp) delete m_temp;
m_temp=NULL;
};
void CString::Empty()
{
m_data ="";
}
CString::CString(const CString &other)
{
m_temp=NULL;
m_data=other.m_data;
}
int CString::GetLength()const
{
return m_data.length();
}
int CString::Find(char *str)
{
std::string dataStr=m_data.toStdString();
return dataStr.find(str);
}
int CString::Find(CString &another)
{
return m_data.toStdString().find(another.m_data.toStdString());
}
int CString::Find(char str)
{
std::string dataStr=m_data.toStdString();
return dataStr.find(str);
}
int CString::Find(char str[],int start)
{
std::string dataStr=m_data.toStdString();
int npos=dataStr.find(str);
if(npos==-1)
return -1;
if(npos<start)
return -1;
return dataStr.find(str);
}
int CString::ReverseFind(char ch)
{
int index=m_data.lastIndexOf(ch);
return index;
}
int CString::Insert(int pos ,const CString Sctr)
{
m_data.insert(pos,Sctr.m_data);
return m_data.length();
}
int CString::Replace(const char *Src,const char *Dest)
{
int length=((std::string)Src).length();
QString srcStr=QString::fromLocal8Bit(Src);
QString destStr=QString::fromLocal8Bit(Dest);
m_data.replace(srcStr,destStr);
return length;
}
void CString::Delete(int fromIndex,int length)
{
m_data=m_data.remove(fromIndex,length);
}
CString & CString::TrimLeft()
{
std::string findStr=" ";
std::string tempstr=m_data.toStdString();
QString temp=m_data;
vector<char>StrVector;
int left=0;
for (int i=0;i<tempstr.length();i++)
{
if(tempstr.at(i)==findStr.at(0)) {
left++;
continue;
}
else break;
}
m_data=temp.mid(left);
return *this;
}
CString & CString::MakeUpper()
{
m_data=m_data.toUpper();
return *this;
}
CString& CString::MakeLower()
{
m_data=m_data.toLower();
return *this;
}
CString & CString::TrimRight()
{
std::string findStr=" ";
std::string tempstr=m_data.toStdString();
QString temp=m_data;
int flag=0;
for (int i=tempstr.length()-1;i>-1;i--)
{
if(tempstr[i]==findStr.at(0)) {
continue;
}
else {
flag=i;
break;
}
}
m_data=temp.left(flag+1);
return *this;
}
bool CString::operator==(const char* other )
{
QString srcStr=QString::fromLocal8Bit(other);
if(this->m_data==srcStr)
return true;
return false;
}
bool CString::operator!=(const char* other )
{
QString srcStr=QString::fromLocal8Bit(other);
if(this->m_data!=srcStr)
return true;
return false;
}
char CString::operator[](int i)
{
char ch=GetChar(i);
return ch;
}
CString CString::Right(int count)const
{
if (count<0)
{
count=0;
}
if (count>m_data.length())
{
return *this;
}
int length=m_data.length();
QString temp=m_data;
QString lastdata=temp.remove(0,length-count);
CString RightStr(lastdata);
return RightStr;
}
CString CString::Mid(int pos,int count)const
{
if (count<0)
{
count=0;
}
QString temp=m_data.mid(pos,count);
CString mstr(temp);
return mstr;
}
CString CString::Mid(int pos)const
{
QString temp=m_data.mid(pos);
CString mstr(temp);
return mstr;
}
CString CString::Left(int count)const
{
if (count<0)
{
count=0;
}
if (count>m_data.length())
{
return *this;
}
int length=m_data.length();
QString temp=m_data;
QString lastdata=temp.remove(count,length-count);
CString leftStr(lastdata);
return leftStr;
}
CString CString::operator + (const CString& SrcStr)
{
CString str;
str.m_data=m_data+SrcStr.m_data;
return str;
}
/*
CString CString::operator = (const QString& SrcStr)
{
CString str;
str.m_data=SrcStr;
return str;
}
*/
CString CString::operator += (CString& SrcStr)
{
m_data = m_data+SrcStr.m_data ;
return *this;
}
CString CString::operator += (const CString& SrcStr)
{
m_data = m_data+SrcStr.m_data ;
return *this;
}
bool CString::operator!=(const CString& other )
{
return m_data!=other.m_data;
}
bool CString::operator==(const CString& other )
{
return m_data==other.m_data;
}
void CString::Alloc(int len)
{
}
char* CString::GetString() const
{
int length=((string)(m_data.toLocal8Bit().data())).length();
if(m_temp) delete m_temp;
m_temp=new char[length+1];
// Alloc(length);
strcpy(m_temp,m_data.toLocal8Bit().data());
return m_temp;
}
char CString::GetChar(int n)
{
return GetString()[n];
}
char CString::GetAt(int n)
{
return GetChar(n);
}
void CString::Format(const char *format,...)
{
//char *str=GetString();
va_list args;
va_start(args,format);
m_data.vsprintf(format,args);
char *buf=new char[2*strlen(m_data.toStdString().c_str())+1];
vsprintf(buf,format,args);
m_data=buf;
delete buf;
va_end(args);
}
void ShowMessage(QString mess)
{
QDialog dialog(NULL);
dialog.setModal(false);
Qt::WindowFlags flags = dialog.windowFlags();
flags |= Qt::WindowStaysOnTopHint;
flags &= ~Qt::WindowContextHelpButtonHint;
dialog.setWindowFlags(flags);
dialog.setWindowTitle("提示");
QFormLayout form(&dialog);
QLabel edit(&dialog);
form.addRow(&edit);
edit.setText(mess);
// QDialogButtonBox buttonBox(QDialogButtonBox::Yes,Qt::Horizontal, &dialog);
// form.addRow(&buttonBox);
// if(buttonBox.button(QDialogButtonBox::Yes)) buttonBox.button(QDialogButtonBox::Yes)->setText("退出");
// QObject::connect(buttonBox.button(QDialogButtonBox::Yes), SIGNAL(clicked()), NULL, SLOT(reject()));
dialog.show();
dialog.exec();
}
int AfxMessageBox(CString str)
{
QDialog dialog(NULL);
dialog.setModal(false);
Qt::WindowFlags flags = dialog.windowFlags();
flags |= Qt::WindowStaysOnTopHint;
flags &= ~Qt::WindowContextHelpButtonHint;
dialog.setWindowFlags(flags);
dialog.setWindowTitle("提示");
QFormLayout form(&dialog);
form.addWidget(new QLabel(str.GetString()));
// dialog.show();
if (dialog.exec() == QDialog::Accepted) {
// Do something here
}
// return MessageBox(NULL,"提示",str.GetString(),NULL );
// QString cstr=str.GetString();
// QMessageBox msgBox;
// msgBox.setText(cstr);
// return msgBox.exec();
return 1;
}
int MessageBox(QWidget *parent,char lpText[128],char*lpCaption, int UINTuType)
{
if (!parent)
{
char *tempName=lpCaption;
QString addStr=QString::fromLocal8Bit(tempName);
return QMessageBox::information(NULL,lpText,addStr,QMessageBox::Ok);
}
return 0;
}

109
WellLogUI/src/TipPop.cpp Normal file
View File

@ -0,0 +1,109 @@
#include "TipPop.h"
#include <QRegion>
#include <QPolygon>
#include <QRect>
#include <QLine>
#include <QPainter>
#include <QPainterPath>
#include <QCursor>
#include <QDebug>
#include <QLabel>
#include <QHBoxLayout>
#include <QSpacerItem>
#define TIP_WIDTH 110
#define TIP_HEIGHT 45
#define TIP_CONTENTWIDTH 80
#define TIP_BORDER 2
#define TIP_LINECOUNT 5
#define TIP_RIGHTMARGIN 2
TipPop::TipPop(QWidget *parent)
: QWidget(parent)
{
this->setFixedSize(TIP_WIDTH,TIP_HEIGHT);
m_Lst=new QLine[TIP_LINECOUNT];
init();
}
TipPop::~TipPop()
{
delete []m_Lst;
}
void TipPop::init()
{
QPolygon polygon;
int offset=TIP_WIDTH-TIP_CONTENTWIDTH;
QRect newRect=this->rect().adjusted(0,0,-offset,0);
QPoint centerP=QPoint(TIP_WIDTH,newRect.center().y());
m_Lst[0]=QLine(newRect.topLeft(),newRect.bottomLeft());
m_Lst[1]=QLine(newRect.bottomLeft(),newRect.bottomRight());
m_Lst[2]=QLine(newRect.topRight(),centerP);
m_Lst[3]=QLine(centerP,newRect.bottomRight());
m_Lst[4]=QLine(newRect.topRight(),newRect.topLeft());
QLine line;
for(int i=0;i<TIP_LINECOUNT;i++)
{
line=m_Lst[i];
polygon<<line.p1()<<line.p2();
}
QRegion region(polygon);
this->setMask(region);
QLabel *lbl=new QLabel(this);
lbl->setObjectName("deplbl");
QFont font;
font.setPixelSize(9);
font.setBold(true);
lbl->setFont(font);
lbl->setStyleSheet("color:white");
lbl->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
QHBoxLayout *vLayout=new QHBoxLayout(this);
vLayout->addWidget(lbl);
QSpacerItem *item=new QSpacerItem(1,1,QSizePolicy::Expanding);
vLayout->addSpacerItem(item);
vLayout->setContentsMargins(0,0,0,0);
}
void TipPopdrawBorder()
{
}
void TipPop::moveCursorPoint(const float &dept)
{
QPoint point= QCursor::pos();
int posX=point.x()-width()-TIP_RIGHTMARGIN;
int posY=point.y()-height()/2.0;
this->setGeometry(QRect(posX,posY,width(),height()));
m_dept=dept;
QLabel* lbl=this->findChild<QLabel*>("deplbl");
lbl->setText(QString(" MD:%1").arg(m_dept));
QFont ft( "Microsoft YaHei", 9, 75);
lbl->setFont(ft);
update();
}
void TipPop::paintEvent(QPaintEvent *)
{
QPainter paint;
paint.begin(this);
int val=TIP_BORDER;
paint.save();
paint.setPen(Qt::NoPen);
paint.setBrush(QColor(75,75,75,100));/*Qt::lightGray*/
paint.drawRect(rect());
paint.restore();
paint.end();
}

29
WellLogUI/src/TipPop.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef TIPPOP_H
#define TIPPOP_H
#include <QWidget>
class TipPop : public QWidget
{
Q_OBJECT
public:
TipPop(QWidget *parent=NULL);
~TipPop();
void paintEvent(QPaintEvent *);
void init();
void moveCursorPoint(const float &dept);
void drawBorder();
private:
float m_deptValue;
float m_value;
private:
QLine *m_Lst;
float m_dept;
};
#endif // TIPPOP_H

View File

@ -0,0 +1,51 @@
#ifndef ADAPTER_DEFS_H
#define ADAPTER_DEFS_H
#include <QVariant>
#include <QObject>
struct DataPair
{
public:
DataPair()
{
}
DataPair(QVariant val,Qt::ItemFlag flg=Qt::NoItemFlags)
{
value=val;
itemflag=flg;
}
DataPair(const DataPair& pair)
{
itemflag=pair.itemflag;
value=pair.value;
}
Qt::ItemFlag itemflag;
QVariant value;
DataPair operator =(const DataPair& pair )
{
itemflag=pair.itemflag;
value=pair.value;
return *this;
}
};
Q_DECLARE_METATYPE(DataPair)
enum DType
{
D_WellData=0,
D_WellLogData,
D_MultWellLogData,
D_TableWellLogData,
D_TDTWellLogData,
D_FMTWellLogData,
D_NONE
};
#endif

705
WellLogUI/src/assetcopy.cpp Normal file
View File

@ -0,0 +1,705 @@
#include "assetcopy.h"
#include <QMenu>
#include <QApplication>
#include <QMimeData>
#include <QClipboard>
#include <qtablewidget.h>
// #include "ObjWellLogTABLE.h"
// #include "ObjDiscreteWellLog.h"
// #include "BaseDialog.h"
#include "DepthProgress.h"
#define DECIMALPLACESNUM 8
//定义表格的行高
#define DefRowHeight 20
//列宽
#define DefColWidth 180
AssetCopy* AssetCopy::p_assCopy =NULL;
AssetCopy::AssetCopy(QObject *parent)
: QObject(parent),m_menu(NULL)
{
m_isParse=false;
}
AssetCopy::~AssetCopy()
{
if(NULL != m_menu)
{
m_menu=NULL;
}
if(NULL !=p_assCopy)
{
p_assCopy=NULL;
}
}
void AssetCopy::SetWellLogs(DType type1,QList<CObjWellLog*>&pWellLogs)
{
type=type1;
m_pWellLogs=pWellLogs;
}
void AssetCopy::onCustomContextMenuRequested(const QPoint &pos)
{
if(NULL != m_menu)
{
m_menu->exec(pos);
}
}
void AssetCopy::onCopyData()
{
m_isParse=false;
if(NULL == m_menu || NULL == m_menu->parent())
return;
QTableWidget *m_table=qobject_cast<QTableWidget*>(m_menu->parent());
if(NULL == m_table)
return;
//if(m_table->isVisible())
QList<QTableWidgetItem*> selItems=m_table->selectedItems();
QList<QTableWidgetSelectionRange> selRanges=m_table->selectedRanges();
if(selItems.size()>0)
{
QTableWidgetSelectionRange copyRange=selRanges.value(0);
int top = copyRange.topRow();
int bottom = copyRange.bottomRow();
int left = copyRange.leftColumn();
int right = copyRange.rightColumn();
QString szClipText;
for(int nRow = top;nRow <=bottom;nRow++)
{
for(int nCol = left;nCol <=right;nCol++)
{
QString szTmp;
auto pItem = m_table->item(nRow,nCol);
if(pItem)
szTmp = pItem->text();
szClipText.append(szTmp);
szClipText.append("\t");
}
szClipText.chop(1);
szClipText.append("\n");
}
QClipboard* clip=QApplication::clipboard();
clip->setText(szClipText);
}
}
void AssetCopy::onCopyLinesData()
{
// if(!m_pWellLogs.size()) return;
// m_isParse=false;
// if(NULL == m_menu || NULL == m_menu->parent()) return;
// QTableWidget *m_table=qobject_cast<QTableWidget*>(m_menu->parent());
// if(NULL == m_table)
// return;
// //if(m_table->isVisible())
// QList<QTableWidgetItem*> selItems=m_table->selectedItems();
// QList<QTableWidgetSelectionRange> selRanges=m_table->selectedRanges();
// CObjWellLogWavefile *pWaveValue=NULL;
// pWaveValue=dynamic_cast<CObjWellLogWavefile *>(m_pWellLogs[0]);
// CObjWellLogTABLE *pTableValue=NULL;
// pTableValue=dynamic_cast<CObjWellLogTABLE *>(m_pWellLogs[0]);
// if(selItems.size()>0)
// {
// QTableWidgetSelectionRange copyRange=selRanges.value(0);
// int top = m_verScrolValue+copyRange.topRow();
// int bottom = m_verScrolValue+copyRange.bottomRow();
// int left = 0;//copyRange.leftColumn();
// int right = m_horScrolValue+m_table->columnCount();
// if(pWaveValue) right =pWaveValue->waveinfo.TimeSamples;
// else if(!pTableValue) right=m_pWellLogs.size();
// char buffer[200];
// QString szClipText;
// float stdep=999999;
// for(int i = 0; i < m_pWellLogs.size(); i++) {
// if(m_pWellLogs[i]->acurveinfo.StartDepth<stdep)
// stdep = m_pWellLogs[i]->acurveinfo.StartDepth;
// }
// double dep=0;
// int nCurrentRow = m_table->currentRow();
// for(int nRow = top;nRow <= bottom; nRow++)
// {
// if(!pTableValue)
// dep=stdep+nRow*m_pWellLogs[0]->acurveinfo.DepLevel;
// for(int nCol = left;nCol < right; nCol++)
// {
// QString szTmp;
// if(nCol==0||pTableValue) {
// auto pItem = m_table->item(nRow,nCol);
// if(pItem)
// szTmp = pItem->text();
// else
// szTmp=toString(dep,'f',5,0);
// }
// else {
// if(pWaveValue) szTmp=toString(pWaveValue->GetData((float)dep,nCol-1,buffer),'f',DECIMALPLACESNUM,0);
// else szTmp=toString(m_pWellLogs[nCol-1]->GetData((float)dep),'f',DECIMALPLACESNUM,0);
// }
// szClipText.append(szTmp);
// szClipText.append("\t");
// }
// szClipText.chop(1);
// szClipText.append("\n");
// }
// QClipboard* clip=QApplication::clipboard();
// clip->setText(szClipText);
// }
}
void AssetCopy::onCopyColnumsData()
{
// if(!m_pWellLogs.size()) return;
// m_isParse=false;
// if(NULL == m_menu || NULL == m_menu->parent())
// return;
// QTableWidget *m_table=qobject_cast<QTableWidget*>(m_menu->parent());
// if(NULL == m_table)
// return;
// //if(m_table->isVisible())
// CObjWellLogWavefile *pWaveValue=NULL;
// pWaveValue=dynamic_cast<CObjWellLogWavefile *>(m_pWellLogs[0]);
// CObjWellLogTABLE *pTableValue=NULL;
// CObjDiscreteWellLog *pTableValue1=NULL;
// pTableValue=dynamic_cast<CObjWellLogTABLE *>(m_pWellLogs[0]);
// pTableValue1=dynamic_cast<CObjDiscreteWellLog *>(m_pWellLogs[0]);
// QList<QTableWidgetItem*> selItems=m_table->selectedItems();
// QList<QTableWidgetSelectionRange> selRanges=m_table->selectedRanges();
// float stdep=999999;
// for(int i=0;i<m_pWellLogs.size();i++) {
// if(m_pWellLogs[i]->acurveinfo.StartDepth<stdep) stdep=m_pWellLogs[i]->acurveinfo.StartDepth;
// }
// if(selItems.size()>0)
// {
// QTableWidgetSelectionRange copyRange=selRanges.value(0);
// int top = 0;//copyRange.topRow();
// int bottom = m_table->rowCount();//copyRange.bottomRow();
// int left = m_horScrolValue+copyRange.leftColumn();
// int right =m_horScrolValue+copyRange.rightColumn();
// if(!pTableValue&&!pTableValue1&&!pWaveValue)
// {
// bottom=(m_pWellLogs[0]->acurveinfo.EndDepth-m_pWellLogs[0]->acurveinfo.StartDepth)/m_pWellLogs[0]->acurveinfo.DepLevel+0.5;
// }
// else if(pWaveValue) {
// bottom=(pWaveValue->waveinfo.EndDepth-pWaveValue->waveinfo.StartDepth)/pWaveValue->waveinfo.DepLevel+0.5;
// }
// QString szClipText;
// char buffer[200];
// QString szTmp;
// float dep=0;
// for(int nRow = top;nRow <=bottom;nRow++)
// {
// if(!pTableValue&&!pTableValue1)dep=stdep+nRow*m_pWellLogs[0]->acurveinfo.DepLevel;
// for(int nCol = left;nCol <=right;nCol++)
// {
// if(nCol==0||pTableValue||pTableValue1) {
// auto pItem = m_table->item(nRow,nCol);
// if(pItem)
// szTmp = pItem->text();
// else if(nCol==0) {
// float val=szTmp.toFloat();
// sprintf(buffer,"%8.3f",val+m_pWellLogs[0]->acurveinfo.DepLevel);
// szTmp =buffer ;
// }
// }
// else {
// if(pWaveValue) szTmp=toString(pWaveValue->GetData(dep,nCol-1,buffer),'f',0);
// else szTmp=toString(m_pWellLogs[nCol-1]->GetData(dep),'f',DECIMALPLACESNUM,0);
// }
// szClipText.append(szTmp);
// szClipText.append("\t");
// }
// szClipText.chop(1);
// szClipText.append("\n");
// }
// QClipboard* clip=QApplication::clipboard();
// clip->setText(szClipText);
// }
}
void AssetCopy::cacheGridData(const QTableWidgetSelectionRange& m_selectionRange)
{
if(m_selectionRange.columnCount() ==0
|| m_selectionRange.rowCount() == 0
|| NULL == m_menu
|| NULL== m_menu->parent())
{
return;
}
QTableWidget *p_table=qobject_cast<QTableWidget*>( m_menu->parent());
if(NULL == p_table)
{
return;
}
m_cacheData.clear();
QTableWidgetItem *item=NULL;
int sRow= m_selectionRange.topRow();
int sCol= m_selectionRange.leftColumn();
int eRow=m_selectionRange.bottomRow();
int eCol=m_selectionRange.rightColumn();
int costCols=m_selectionRange.columnCount();
int costRows=m_selectionRange.rowCount();
QString value;
for(int r=sRow;r<=eRow;r++)
{
QMap<int,QString> colCache;
for(int c=sCol;c<=eCol;c++)
{
item=p_table->item(r,c);
if(NULL != item)
{
value=item->text();
colCache.insert(c,value);
}
}
m_cacheData.insert(r,colCache);
}
}
QString AssetCopy::itemText(int row,int col)
{
QString result="";
if( 0== m_cacheData.count())
{
return result;
}
QMap<int,QString> colMap;
if(m_cacheData.contains(row) )
{
colMap=m_cacheData.value(row);
if(colMap.contains(col))
{
result=colMap.value(col);
}
}
return result;
}
QString AssetCopy::itemParseText(int row,int col)
{
QString result="";
if( 0== m_parseCacheData.count())
{
return result;
}
QMap<int,QString> colMap;
if(m_parseCacheData.contains(row) )
{
colMap=m_parseCacheData.value(row);
if(colMap.contains(col))
{
result=colMap.value(col);
}
}
return result;
}
//////////////复制、粘贴////////////////////////////////////////////////////
QByteArray AssetCopy::seriseSelectRange(const QTableWidgetSelectionRange& selectRange)
{
QByteArray barr;
QDataStream ds(&barr,QIODevice::WriteOnly);
ds.setByteOrder(QDataStream::BigEndian);
ds<<selectRange.topRow()
<<selectRange.leftColumn()
<<selectRange.bottomRow()
<<selectRange.rightColumn();
return barr;
}
QTableWidgetSelectionRange AssetCopy::deseriseSelectRange( QByteArray& selectByte)
{
QDataStream ds(&selectByte,QIODevice::ReadOnly);
ds.setByteOrder(QDataStream::BigEndian);
int top,left,bottom,right;
ds>>top>>left>>bottom>>right;
return QTableWidgetSelectionRange(top,left,bottom,right);
}
void AssetCopy::setVerScrollValue(int value)
{
m_verScrolValue=value;
}
void AssetCopy::setHorScrollValue(int value)
{
m_horScrolValue=value;
}
void AssetCopy::parseData(const QTableWidgetSelectionRange& parse)
{
if(NULL == m_menu || NULL == m_menu->parent())
{
return;
}
QTableWidget *m_table=qobject_cast<QTableWidget*>(m_menu->parent());
if(NULL == m_table)
{
return;
}
QList<QTableWidgetSelectionRange> rangeLst=m_table->selectedRanges();
if(rangeLst.size()==0)
{
return;
}
QTableWidgetSelectionRange selRange=rangeLst.value(0);
int tableRowCount=m_table->rowCount();
int tbaleColCount=m_table->columnCount();
int top,left,bottom,right;
int selRows=selRange.rowCount();
int selCols=selRange.columnCount();
//选择一格自动填充
if(selRows==selCols && selRows==1)
{
top=selRange.topRow();
left=selRange.leftColumn();
int parRows=parse.rowCount();
int parCols=parse.columnCount();
bottom=top+parRows-1;
right=left+parCols-1;
//裁剪区域大小总行
if(parRows+top>tableRowCount)
{
bottom=tableRowCount-1;
}
//大于总列
if(parCols+left>tbaleColCount)
{
right=tbaleColCount-1;
}
}else //选择方式
{
top=selRange.topRow();
left=selRange.leftColumn();
int scCount= selRange.columnCount();
int srCount=selRange.rowCount();
int pcCount=parse.columnCount();
int prcCount=parse.rowCount();
//选中区域大于粘贴区域
if(scCount>pcCount && srCount>prcCount)
{
bottom=top+prcCount-1;
right=left+pcCount-1;
//选中区域列大于粘贴区域
}else if( scCount>pcCount && srCount<prcCount)
{
bottom=selRange.bottomRow();
right=left+pcCount-1;
//选中区域行大于粘贴区域
}else if(scCount<pcCount && srCount>prcCount)
{
bottom=top+prcCount-1;
right=selRange.rightColumn();
}
}
int begRow=parse.topRow();
int endRow=begRow+bottom-top;
int begCol=parse.leftColumn();
int endCol=begCol+right-left;
int moveRows=top- begRow;
int moveCols=left-begCol;
QString text;
int row,col;
m_parseCacheData.clear();
//取原数据粘贴数据
for(int i=begRow;i<=endRow;i++)
{
QMap<int,QString> colMap;
row=i+moveRows;
for(int j=begCol;j<=endCol;j++)
{
text=itemText(i,j);//m_table->item(i,j)->text();
col=j+moveCols;
colMap.insert(col,text);
m_table->item(row,col)->setText(text);
}
m_parseCacheData.insert(row,colMap);
}
//int top=begRow+moveRows+m_verScrolValue;
//int bottom=endRow+moveRows+m_verScrolValue;
//int left=begCol+moveCols+m_horScrolValue;
//int right=endCol+moveCols+m_horScrolValue;
int topRow=begRow+moveRows;
int bottomRow=endRow+moveRows;
int leftCol=begCol+moveCols;
int rightCol=endCol+moveCols;
QTableWidgetSelectionRange parselRange(topRow,leftCol,bottomRow,rightCol);
m_isParse=true;
emit signalParseData(parselRange);
}
void AssetCopy::restParse()
{
m_isParse=false;
}
bool AssetCopy::isParse()
{
return m_isParse;
}
void AssetCopy::changeCacheRowCol(int orgRow,int orgCol,int movRow,int movCol)
{
QMap<int,QMap<int,QString> >::iterator mItor=m_cacheData.begin();
QMap<int,QString>::iterator itor;
QMap<int,QString> mapValue;
QString value;
for(;mItor!=m_cacheData.end();mItor++)
{
if(mItor.key()==orgRow)
{
mapValue=mItor.value();
m_cacheData.erase(mItor);
m_cacheData.insert(movRow,mapValue);
mItor=m_cacheData.begin();
}
itor=mItor->begin();
for(;itor!=mItor->end();itor++)
{
if(itor.key()==orgCol)
{
value=itor.value();
mItor->erase(itor);
mItor->insert(movCol,value);
itor=mItor->begin();
}
}
}
}
void AssetCopy::reqCustomComtextMenu(const QPoint &pos)
{
emit signalReqCustomContextMenu(pos);
}
void AssetCopy::onParseData()
{
// if(type == D_MultWellLogData)
// {
// int choose = QMessageBox::question(NULL, tr("提示"),
// QString(tr("该数据格式下,粘贴后将直接存储,是否粘贴?")),
// QMessageBox::Yes | QMessageBox::No);
// if(choose == QMessageBox::No)
// return;
// }
// if(!m_pWellLogs.size()) return;
// if(NULL == m_menu || NULL == m_menu->parent())
// return;
// QTableWidget *m_table=qobject_cast<QTableWidget*>(m_menu->parent());
// if(NULL == m_table)
// return;
// QClipboard* pClip = QApplication::clipboard();
// QString szText = pClip->text();
// if(szText.isEmpty())
// return;
// int nSpace = 0;
// int nDou=0;
// int nTab =0;
// DepthProgress MyDepthProgress2;
// MyDepthProgress2.CreatProgress(0, szText.size(), "粘贴内容检查中...");
// for(int nIndex =0;nIndex<szText.size();++nIndex)
// {
// if(szText[nIndex]=='\t')
// {
// nTab++;
// }
// else if(szText[nIndex]==' ')
// {
// nSpace++;
// }
// else if(szText[nIndex]==',')
// {
// nDou++;
// }
// MyDepthProgress2.SetDepth(nIndex);
// }
// int nMax = nSpace>nDou ? nSpace : nDou;
// nMax = nMax>nTab ? nMax : nTab;
// char rFlag;
// if(nMax==nTab)
// {
// rFlag ='\t';
// }
// else if(nMax==nSpace)
// {
// rFlag =' ';
// }
// else if(nMax==nDou)
// {
// rFlag =',';
// }
// m_table->clearSelection();
// QStringList rSplitList = szText.split('\n');
// if(rSplitList.size()&&rSplitList[rSplitList.size()-1]=="") rSplitList.removeAt(rSplitList.size()-1);
// CObjWellLogWavefile *pWaveValue=NULL;
// pWaveValue=dynamic_cast<CObjWellLogWavefile *>(m_pWellLogs[0]);
// CObjWellLogTABLE *pTableValue=NULL;
// pTableValue=dynamic_cast<CObjWellLogTABLE *>(m_pWellLogs[0]);
// CObjDiscreteWellLog *pTableValue1=NULL;
// pTableValue1=dynamic_cast<CObjDiscreteWellLog *>(m_pWellLogs[0]);
// float stdep=999999;
// for(int i=0;i<m_pWellLogs.size();i++) {
// if(m_pWellLogs[i]->acurveinfo.StartDepth<stdep) stdep=m_pWellLogs[i]->acurveinfo.StartDepth;
// }
// float dep=0;
// //起始行
// int nCurrentRow = m_table->currentRow();
// //纵向扩充表格
// MyDepthProgress2.CreatProgress(0, rSplitList.size(), "表格建设中...");
// MyDepthProgress2.SetDepth(0);
// for(int cTemp = nCurrentRow; cTemp < (nCurrentRow + rSplitList.size()); cTemp++){
// if(cTemp >= m_table->rowCount())
// needANewLine(cTemp);
// MyDepthProgress2.SetDepth(cTemp - nCurrentRow);
// }
// //进度条
// int curprogre = 0;
// MyDepthProgress2.CreatProgress(0, rSplitList.size(), "数据归位...");
// MyDepthProgress2.SetDepth(0);
// for(int nRow = 0; nRow < rSplitList.size(); ++nRow)
// {
// if(!pTableValue)
// dep = stdep + (m_verScrolValue + nCurrentRow) * m_pWellLogs[0]->acurveinfo.DepLevel;
// //起始列
// int nCurrentColumn = m_table->currentColumn();
// QStringList rColumnList = rSplitList[nRow].split(rFlag);
// for(int nCol = 0; nCol < rColumnList.size(); nCol++)
// {
// if(pTableValue||pTableValue1) {
// //空替换
// if(rColumnList[nCol].isEmpty() ) rColumnList[nCol] = "";
// auto pItem = m_table->item(nCurrentRow, nCurrentColumn);
// //写值
// if(pItem)
// pItem->setText(rColumnList[nCol]);
// else
// {
// QTableWidgetItem* pItem = new QTableWidgetItem;
// pItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsTristate);
// pItem->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);//对齐
// if(nCurrentColumn == 0) pItem->setFlags(pItem->flags() & (~Qt::ItemIsEditable));
// pItem->setFont(QFont("Times",10));
// m_table->setItem(nCurrentRow, nCurrentColumn, pItem);
// pItem->setText(rColumnList[nCol]);
// }
// }
// else if(nCurrentColumn){
// float val=rColumnList[nCol].toFloat();
// if(pWaveValue) pWaveValue->SetData(dep,m_horScrolValue+nCurrentColumn-1,&val);
// else m_pWellLogs[m_horScrolValue+nCurrentColumn-1]->SetData(dep,&val);
// }
// nCurrentColumn++;
// MyDepthProgress2.SetDepth(++curprogre);
// }
// nCurrentRow++;
// }
// if(!pTableValue)
// for(int i=0;i<m_pWellLogs.size();i++)
// {
// m_pWellLogs[i]->SetModify(true);
// m_pWellLogs[i]->SaveToSLF();
// }
// emit saveToTempModel();
/*
CBaseDialog *pTableDialog=(CBaseDialog*)(m_table->parent());
if(pTableDialog) {
//粘贴操作不直接保存,刷新操作会重新读表格数据
//pTableDialog->ReFreshWindow(type);
}
*/
}
void AssetCopy::initPopMenu(QTableWidget *pTable, QMenu *pmenu)
{
if(pmenu == NULL)
m_menu = new QMenu(pTable);
else
m_menu = pmenu;
QIcon icon = QIcon(::GetImagePath() + "/UIMake/fuzhi.png");
QAction* action = m_menu->addAction(icon, "复制选中数据");
connect(action,SIGNAL(triggered()),this,SLOT(onCopyData()));
icon = QIcon(::GetImagePath() + "/UIMake/Hfuzhi.png");
action = m_menu->addAction(icon, "复制选中行数据");
connect(action,SIGNAL(triggered()),this,SLOT(onCopyLinesData()));
icon = QIcon(::GetImagePath() + "/UIMake/Vfuzhi.png");
action = m_menu->addAction(icon, "复制选中列数据");
connect(action,SIGNAL(triggered()),this,SLOT(onCopyColnumsData()));
icon = QIcon(::GetImagePath() + "/UIMake/pas.png");
action = m_menu->addAction(icon, "粘贴");
connect(action,SIGNAL(triggered()),this,SLOT(onParseData()));
connect(this,SIGNAL(signalReqCustomContextMenu(QPoint)),this,SLOT(onCustomContextMenuRequested(QPoint)),Qt::UniqueConnection);
}

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,9 @@
#include "formhead.h"
#include "ui_formhead.h"
#include <QMessageBox>
#include <QDebug>
#include <QMenu>
#include <QClipboard>
#include "CallManage.h"
#include <QTimer>
@ -26,15 +28,27 @@ FormHead::FormHead(QWidget *parent, int indexID) :
QTableView::item {border-right: 0px solid black;} \
QTableView::item:selected {border-right: 0px solid black;}");
//使能右键菜单功能
//
//ui->tableWidget->verticalHeader()->hide(); //行
//ui->tableWidget->horizontalHeader()->hide(); //列
ui->tableWidget->verticalHeader()->setFixedWidth(3);//标题栏宽度
ui->tableWidget->horizontalHeader()->setFixedHeight(3);//标题栏高度
//ui->tableWidget->setColumnCount(1); //动态设置列数
//ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//最后一列铺满最后
//标题
// QTableWidgetItem *headerItem = new QTableWidgetItem("");
// ui->tableWidget->setHorizontalHeaderItem(0, headerItem);
//我们让一列也可以滑动
ui->tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
ui->tableWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
// 设置右键菜单策略
ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
// 在窗口构造函数中
//ui->tableWidget->installEventFilter(this);
// 连接信号和槽
// 创建并设置定时器
// m_timer = new QTimer(this);
// connect(m_timer, &QTimer::timeout, this, &FormHead::resizeWindow);
// m_timer->start(5); // 设置定时器为5毫秒
connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
}
FormHead::~FormHead()
@ -48,13 +62,12 @@ void FormHead::resizeWindow()
//调整大小
if(rect.width()>m_iCols*g_iColsWidth)
{
ui->tableWidget->setGeometry((rect.width()-(m_iCols*g_iColsWidth+1))/2, 0, m_iCols*(g_iColsWidth+1), m_iRows*(g_iRowsHight+2));
ui->tableWidget->setGeometry((rect.width()-(m_iCols*g_iColsWidth+1))/2, 0, m_iCols*(g_iColsWidth+1)+4, m_iRows*(g_iRowsHight+2)+4);
}
else
{
ui->tableWidget->setGeometry(0, 0, m_iCols*(g_iColsWidth+1), m_iRows*(g_iRowsHight+2));
ui->tableWidget->setGeometry(0, 0, m_iCols*(g_iColsWidth+1)+4, m_iRows*(g_iRowsHight+2)+4);
}
//m_timer->stop();
}
void FormHead::resizeEvent(QResizeEvent *event)
@ -69,8 +82,8 @@ void FormHead::Init(int iRows, int iCols, int iWidth)
//清空
ui->tableWidget->clearContents();
ui->tableWidget->verticalHeader()->hide();//隐藏左侧系统序号栏
ui->tableWidget->horizontalHeader()->hide();//隐藏上方系统序号栏
//ui->tableWidget->verticalHeader()->hide();//隐藏左侧系统序号栏
//ui->tableWidget->horizontalHeader()->hide();//隐藏上方系统序号栏
//ui->tableWidget->verticalHeader()->setFixedWidth(3);//标题栏宽度
//ui->tableWidget->horizontalHeader()->setFixedHeight(3);//标题栏高度
@ -95,3 +108,257 @@ void FormHead::Init(int iRows, int iCols, int iWidth)
}
}
}
void FormHead::slotContextMenu(QPoint pos)
{
QMenu menu(ui->tableWidget);
QAction *mergeAction = menu.addAction("合并表格");
QAction *refreshAction = menu.addAction("拆分表格");
QAction *deleteAction = menu.addAction("删除行");
QAction *addAction = menu.addAction("添加行");
// 弹出菜单
QAction *selectedAction = menu.exec(ui->tableWidget->mapToGlobal(pos));
if (selectedAction == mergeAction) {
qDebug() << "合并表格";
slotMerge();
} else if (selectedAction == deleteAction) {
//删除1行
int row = ui->tableWidget->currentRow();
ui->tableWidget->removeRow(row);
} else if (selectedAction == refreshAction) {
qDebug() << "拆分表格";
slotSplit();
}
}
//合并
void FormHead::slotMerge()
{
QModelIndexList list = ui->tableWidget->selectionModel()->selectedIndexes();
if (list.size() < 2)
{
QMessageBox::warning(this, "单元格合并", "所选中单元格中为单个单元格,无法合并", "确定");
return;
}
int topRow = 0;
int leftCol = 0;
int bottomRow = 0;
int rightCol = 0;
QList<QTableWidgetSelectionRange> selectRanges = ui->tableWidget->selectedRanges();
if (selectRanges.size() > 0)
{
topRow = selectRanges[0].topRow();
leftCol = selectRanges[0].leftColumn();
bottomRow = selectRanges[0].bottomRow();
rightCol = selectRanges[0].rightColumn();
}
for(auto range:selectRanges)
{
if(range.topRow()<topRow)
topRow=range.topRow();
if(range.leftColumn()<leftCol)
leftCol=range.leftColumn();
if(range.bottomRow()> bottomRow)
bottomRow=range.bottomRow();
if(range.rightColumn()>rightCol)
rightCol=range.rightColumn();
}
int rowSpan = (bottomRow - topRow) + 1;
int colSpan = (rightCol - leftCol) + 1;
ui->tableWidget->setSpan(topRow, leftCol, rowSpan, colSpan);
}
//拆分
void FormHead::slotSplit()
{
int row,col;
QList<QTableWidgetSelectionRange> selectRanges = ui->tableWidget->selectedRanges();
if (selectRanges.size() < 2)
{
QMessageBox::warning(this, "拆分表格失败", "单元格已是最小单位,不能再进行拆分", "确定");
return;
}
QList<QTableWidgetItem*> selectItems = ui->tableWidget->selectedItems();
if(selectItems.size()==0)
{
QMessageBox::warning(this, "拆分表格失败", "请先为表格设置元素item", "确定");
return;
}
if(selectItems.size()>1)
{
QMessageBox::warning(this, "拆分表格失败", "非法选择", "确定");
return;
}
for(auto item:selectItems)
{
row= item->row();
col=item->column();
}
ui->tableWidget->setSpan(row, col, 1, 1); // 设置跨度为1
}
bool FormHead::eventFilter(QObject* obj, QEvent* event)
{
if (obj == ui->tableWidget && event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->matches(QKeySequence::Paste)) {
onPasteExcelData();
return true;
}
}
return QWidget::eventFilter(obj, event);
}
//复制粘贴事件
void FormHead::keyPressEvent(QKeyEvent * event)
{
//excel 行分是 "\n" ; 列分是 "\t"
if (event->matches(QKeySequence::Copy))
{
copy();
}
else if (event->matches(QKeySequence::Paste))
{
Paste();
}
else if (event->matches(QKeySequence::SelectAll))
{
ui->tableWidget->selectAll();
}
else
{
QWidget::keyPressEvent(event);
}
}
void FormHead::copy()
{
QMap<int, QList<int>> selMap;//行,列
QList<QTableWidgetItem*> list = ui->tableWidget->selectedItems();
if (list.count() <= 0)
return;
for (QTableWidgetItem* item : list)
{
int rowN = ui->tableWidget->row(item);
int colN = ui->tableWidget->column(item);
selMap[rowN].append(colN);
}
QString cpStr;
QMap<int, QList<int>>::iterator it = selMap.begin();
while (it != selMap.end())
{
for (int i = 0; i < (*it).count(); i++)
{
QTableWidgetItem* item = ui->tableWidget->item(it.key(), (*it).at(i));
if (item)
{
cpStr.append(item->text().trimmed());
}
if (i != (*it).count() - 1)
cpStr.append("\t");
}
it++;
if (it != selMap.end())
{
cpStr.append("\n");
}
}
QApplication::clipboard()->setText(cpStr);
}
void FormHead::Paste()
{
QString pastText = QApplication::clipboard()->text();
QStringList rowList = pastText.split("\n", QString::KeepEmptyParts);
if(rowList.size()==0)
{
return;
}
if(rowList.at(rowList.size()-1)=="")
{
rowList.removeAt(rowList.size()-1);
}
QTableWidgetItem* crtItem = ui->tableWidget->currentItem();
int rowN, colN;
if (!crtItem)
{
rowN = ui->tableWidget->currentRow();
colN = ui->tableWidget->currentColumn();
}
else
{
rowN = ui->tableWidget->row(crtItem);
colN = ui->tableWidget->column(crtItem);
}
for (int i = 0; i < (ui->tableWidget->rowCount() - rowN) && (i < rowList.length()); i++)
{
QStringList rowDataList = rowList.at(i).split("\t", QString::KeepEmptyParts);
for (int j = 0; j < (ui->tableWidget->columnCount() - colN) && (j < rowDataList.length()); j++)
{
int x = i + rowN;
int y = j + colN;
QTableWidgetItem* item = ui->tableWidget->item(x, y);
if (item)
{
item->setText(rowDataList.at(j));
}
else
{
ui->tableWidget->setItem(x, y, new QTableWidgetItem(rowDataList.at(j)));
}
}
}
}
void FormHead::onPasteExcelData()
{
// QClipboard* clipboard = QApplication::clipboard();
// const QString clipData = clipboard->text();
// if (clipData.isEmpty()) return;
// QList<QStringList> rowsData;
// const QStringList rows = clipData.split('\n', QString::SkipEmptyParts);
// for (const QString row:rows) {
// rowsData << row.split('\t', QString::SkipEmptyParts);
// }
// QTableWidget* table = ui->tableWidget;
// const QModelIndex currentIndex = table->currentIndex();
// const int startRow = currentIndex.isValid() ? currentIndex.row() : 0;
// const int startCol = currentIndex.isValid() ? currentIndex.column() : 0;
// table->setUpdatesEnabled(false);
// table->setRowCount(std::max(table->rowCount(), startRow + rowsData.size()));
// table->setColumnCount(std::max(table->columnCount(), startCol + rowsData[0].size()));
// //更新行数,列数
// m_iRows = table->rowCount();
// m_iCols = table->columnCount();
// for (int i = 0; i < rowsData.size(); ++i) {
// for (int j = 0; j < rowsData[i].size(); ++j) {
// if (startRow + i >= table->rowCount()) break;
// if (startCol + j >= table->columnCount()) break;
// QTableWidgetItem* item = table->item(startRow + i, startCol + j);
// if (!item) {
// item = new QTableWidgetItem();
// table->setItem(startRow + i, startCol + j, item);
// }
// item->setText(rowsData[i][j]);
// }
// }
// table->setUpdatesEnabled(true);
// //改变大小
// resizeWindow();
}

View File

@ -21,11 +21,19 @@ public:
private:
Ui::FormHead *ui;
protected:
//支持复制粘贴,暂时还未实现
void keyPressEvent(QKeyEvent * e);
public:
//图头
bool eventFilter(QObject* obj, QEvent* event);
void onPasteExcelData();
public:
int m_indexID;
int m_iRows;
int m_iCols;
QTimer *m_timer;
public:
void Init(int iRows, int iCols, int iWidth);
@ -34,6 +42,13 @@ public:
public slots:
void resizeWindow();
//图头右键菜单响应函数
void slotContextMenu(QPoint pos);
void slotMerge();//合并
void slotSplit();//拆分
//图头
void copy();
void Paste();
};
#endif // FORMHEAD_H

172
logPlus/formmultiheads.cpp Normal file
View File

@ -0,0 +1,172 @@
#include "formmultiheads.h"
#include "ui_formmultiheads.h"
#include <QDebug>
#include <QMenu>
#include "newheaddialog.h"
#include "formhead.h"
extern int g_iRows;
extern int g_iCols;
extern int g_iColsWidth;
extern int g_iRowsHight;
FormMultiHeads::FormMultiHeads(QWidget *parent) :
QWidget(parent),
ui(new Ui::FormMultiHeads)
{
ui->setupUi(this);
//-------------------------------------
//ui->tableWidget->hide();
//隐藏网格线
ui->tableWidget->setShowGrid(false);
//设置样式表,不显示竖直边框
ui->tableWidget->setStyleSheet( "QTableView::item {border-left: 0px solid black;} \
QTableView::item:selected {border-left: 0px solid black;}\
QTableView::item {border-right: 0px solid black;} \
QTableView::item:selected {border-right: 0px solid black;}");
//
//ui->tableWidget->verticalHeader()->hide(); //行
//ui->tableWidget->horizontalHeader()->hide(); //列
ui->tableWidget->verticalHeader()->setFixedWidth(3);//标题栏宽度
ui->tableWidget->horizontalHeader()->setFixedHeight(3);//标题栏高度
ui->tableWidget->setColumnCount(1); //动态设置列数
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//最后一列铺满最后
//标题
QTableWidgetItem *headerItem = new QTableWidgetItem("");
ui->tableWidget->setHorizontalHeaderItem(0, headerItem);
//我们让一列也可以滑动
ui->tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
ui->tableWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
// 设置右键菜单策略
ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
// 在窗口构造函数中
//ui->tableWidget->installEventFilter(this);
}
FormMultiHeads::~FormMultiHeads()
{
delete ui;
}
void FormMultiHeads::slotContextMenu(QPoint pos)
{
QMenu menu(ui->tableWidget);
QAction *newAction = menu.addAction("新建图头");
// 弹出菜单
QAction *selectedAction = menu.exec(ui->tableWidget->mapToGlobal(pos));
if (selectedAction == newAction) {
NewHeadDialog *dlg = new NewHeadDialog(this);
//
dlg->setAttribute(Qt::WA_DeleteOnClose);//关闭时,自动删除窗口对象
int result = dlg->exec();//模态对话框
if (result == QDialog::Accepted) {
// 处理用户点击了确定按钮的逻辑
qDebug() << "Accepted=";
int rowcount = ui->tableWidget->rowCount(); //总行数
//增加1行
ui->tableWidget->setRowCount(rowcount+1);
//行标题
QTableWidgetItem *headerItem = new QTableWidgetItem("");
ui->tableWidget->setVerticalHeaderItem(rowcount, headerItem);
int iWidth=0;
//设置行高度
ui->tableWidget->setRowHeight(rowcount, g_iRows*(g_iRowsHight+2)+1);
if(rowcount==0)
{
iWidth=g_iCols*g_iColsWidth;
//设置列宽
ui->tableWidget->setColumnWidth(0, g_iCols*(g_iColsWidth+1)+1);
}
else
{
iWidth=ui->tableWidget->columnWidth(0);
if(iWidth<g_iCols*g_iColsWidth)//列宽变大
{
iWidth=g_iCols*g_iColsWidth;
//设置列宽
ui->tableWidget->setColumnWidth(0, g_iCols*(g_iColsWidth+1)+1);
}
}
//
FormHead *widgetHead = new FormHead(this, 1);
widgetHead->Init(g_iRows, g_iCols, iWidth);
ui->tableWidget->setCellWidget(rowcount, 0, widgetHead);
}
else if (result == QDialog::Rejected) {
// 处理用户点击了取消按钮的逻辑
qDebug() << "Rejected=";
}
else {
// 处理其他情况的逻辑
qDebug() << "other=";
}
}
// if(ui->tableWidget->rowCount()==0 && ui->tableWidget->rowCount()==0)
// {
// QMenu menu(ui->tableWidget);
// QAction *newAction = menu.addAction("新建图头");
// // 弹出菜单
// QAction *selectedAction = menu.exec(ui->tableWidget->mapToGlobal(pos));
// if (selectedAction == newAction) {
// NewHeadDialog *dlg = new NewHeadDialog(this);
// //
// dlg->setAttribute(Qt::WA_DeleteOnClose);//关闭时,自动删除窗口对象
// int result = dlg->exec();//模态对话框
// if (result == QDialog::Accepted) {
// // 处理用户点击了确定按钮的逻辑
// qDebug() << "Accepted=";
// //
// ui->tableWidget->clear();
// //
// ui->tableWidget->setColumnCount(g_iCols);
// ui->tableWidget->setRowCount(g_iRows); //动态设置行数
// for(int i=0; i<g_iRows; i++)
// {
// for(int j=0; j<g_iCols; j++)
// {
// QTableWidgetItem* item = new QTableWidgetItem("");
// ui->tableWidget->setItem(i, j, item);
// }
// }
// }
// else if (result == QDialog::Rejected) {
// // 处理用户点击了取消按钮的逻辑
// qDebug() << "Rejected=";
// }
// else {
// // 处理其他情况的逻辑
// qDebug() << "other=";
// }
// }
// }
// else
// {
// QMenu menu(ui->tableWidget);
// QAction *mergeAction = menu.addAction("合并表格");
// QAction *refreshAction = menu.addAction("拆分表格");
// QAction *deleteAction = menu.addAction("删除行");
// QAction *addAction = menu.addAction("添加行");
// // 弹出菜单
// QAction *selectedAction = menu.exec(ui->tableWidget->mapToGlobal(pos));
// if (selectedAction == mergeAction) {
// qDebug() << "合并表格";
// slotMerge();
// } else if (selectedAction == deleteAction) {
// //删除1行
// int row = ui->tableWidget->currentRow();
// ui->tableWidget->removeRow(row);
// } else if (selectedAction == refreshAction) {
// qDebug() << "拆分表格";
// slotSplit();
// }
// }
}

29
logPlus/formmultiheads.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef FORMMULTIHEADS_H
#define FORMMULTIHEADS_H
#include <QWidget>
namespace Ui {
class FormMultiHeads;
}
class FormMultiHeads : public QWidget
{
Q_OBJECT
public:
explicit FormMultiHeads(QWidget *parent = nullptr);
~FormMultiHeads();
private:
Ui::FormMultiHeads *ui;
public slots:
//图头右键菜单响应函数
void slotContextMenu(QPoint pos);
};
#endif // FORMMULTIHEADS_H

36
logPlus/formmultiheads.ui Normal file
View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FormMultiHeads</class>
<widget class="QWidget" name="FormMultiHeads">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>18</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>18</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QTableWidget" name="tableWidget"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -40,6 +40,7 @@ SOURCES += \
formhead.cpp \
forminfo.cpp \
formline.cpp \
formmultiheads.cpp \
formtrack.cpp \
formwell.cpp \
mainwindow.cpp \
@ -72,6 +73,7 @@ HEADERS += \
formhead.h \
forminfo.h \
formline.h \
formmultiheads.h \
formtrack.h \
formwell.h \
mainwindow.h \
@ -93,6 +95,7 @@ FORMS += \
formhead.ui \
forminfo.ui \
formline.ui \
formmultiheads.ui \
formtrack.ui \
formwell.ui \
interfaceWidget.ui \

View File

@ -10,7 +10,6 @@
#include "qtprojectwidgets.h"
#include "qtcenterwidgets.h"
#include "mainwindownew.h"
#include "mainwindowcurve.h"
#include "customtabwidget.h"
#include "ConsoleOutputWidget.h"
@ -47,10 +46,10 @@ public:
//停靠栏
QStackedWidget *m_stackedWidget_Center = nullptr;//中间工作区stack
QDockWidget *m_projectView = nullptr; //左侧工程区
QDockWidget *m_propertyView = nullptr; //右侧属性区
QDockWidget *m_logView = nullptr; //下方日志区
QDockWidget *m_gdbView = nullptr; //下方调试区
//QDockWidget *m_projectView = nullptr; //左侧工程区
//QDockWidget *m_propertyView = nullptr; //属性区
//QDockWidget *m_logView = nullptr; //日志区
//QDockWidget *m_gdbView = nullptr; //调试区
//子页面
QtProjectWidgets *m_projectWidgets; //左侧工程区

View File

@ -9,7 +9,7 @@
#include <QtConcurrent/QtConcurrent>
#include "newheaddialog.h"
#include "formhead.h"
#include "qmytablewidget.h"
//#include "qmytablewidget.h"
extern int g_iOneWidth; //道宽
extern QString g_prjname;
@ -45,31 +45,31 @@ MainWindowCurve::MainWindowCurve(QWidget *parent) :
//-------------------------------------
ui->tableWidget->hide();
//隐藏网格线
ui->tableWidget->setShowGrid(false);
//设置样式表,不显示竖直边框
ui->tableWidget->setStyleSheet( "QTableView::item {border-left: 0px solid black;} \
QTableView::item:selected {border-left: 0px solid black;}\
QTableView::item {border-right: 0px solid black;} \
QTableView::item:selected {border-right: 0px solid black;}");
//
ui->tableWidget->verticalHeader()->hide(); //行
ui->tableWidget->horizontalHeader()->hide(); //列
//ui->tableWidget->verticalHeader()->setFixedWidth(3);//标题栏宽度
//ui->tableWidget->horizontalHeader()->setFixedHeight(3);//标题栏高度
ui->tableWidget->setColumnCount(1); //动态设置列数
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//最后一列铺满最后
//标题
QTableWidgetItem *headerItem = new QTableWidgetItem("");
ui->tableWidget->setHorizontalHeaderItem(0, headerItem);
//我们让一列也可以滑动
ui->tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
ui->tableWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
// 设置右键菜单策略
ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
// 在窗口构造函数中
//ui->tableWidget->installEventFilter(this);
// //隐藏网格线
// ui->tableWidget->setShowGrid(false);
// //设置样式表,不显示竖直边框
// ui->tableWidget->setStyleSheet( "QTableView::item {border-left: 0px solid black;} \
// QTableView::item:selected {border-left: 0px solid black;}\
// QTableView::item {border-right: 0px solid black;} \
// QTableView::item:selected {border-right: 0px solid black;}");
// //
// ui->tableWidget->verticalHeader()->hide(); //行
// ui->tableWidget->horizontalHeader()->hide(); //列
// //ui->tableWidget->verticalHeader()->setFixedWidth(3);//标题栏宽度
// //ui->tableWidget->horizontalHeader()->setFixedHeight(3);//标题栏高度
// ui->tableWidget->setColumnCount(1); //动态设置列数
// ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//最后一列铺满最后
// //标题
// QTableWidgetItem *headerItem = new QTableWidgetItem("");
// ui->tableWidget->setHorizontalHeaderItem(0, headerItem);
// //我们让一列也可以滑动
// ui->tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
// ui->tableWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
// // 设置右键菜单策略
// ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
// connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
// // 在窗口构造函数中
// //ui->tableWidget->installEventFilter(this);
//-------------------------------------
//ui->tableWidget_2->setFrameShape(QFrame::NoFrame); //设置无边框
@ -91,11 +91,6 @@ MainWindowCurve::MainWindowCurve(QWidget *parent) :
ui->tableWidget_2->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
ui->tableWidget_2->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
// //表头
// QStringList list;
// list << "" << "" << "" << "";
// ui->tableWidget->setHorizontalHeaderLabels(list);
//-------------------------------------
ui->tableWidget_3->hide();
ui->tableWidget_3->verticalHeader()->hide();
@ -106,6 +101,26 @@ MainWindowCurve::MainWindowCurve(QWidget *parent) :
connect(this, SIGNAL(sig_NewWell(QString)), this, SLOT(s_NewWell(QString)));
connect(CallManage::getInstance(), SIGNAL(sig_mouseWheel(QWheelEvent*)), this, SLOT(s_mouseWheel(QWheelEvent*)));
//数据组织与管理树
m_dock1=new QDockWidget(tr(""),this);
m_dock1->setFeatures(QDockWidget::NoDockWidgetFeatures);//QDockWidget::DockWidgetMovable
//dock1->setAllowedAreas(Qt::TopDockWidgetArea);
//
m_formMultiHeads = new FormMultiHeads(this);
m_dock1->setWidget(m_formMultiHeads);
addDockWidget(Qt::TopDockWidgetArea,m_dock1);
//移除标题栏
QWidget* lTitleBar = m_dock1->titleBarWidget();
QWidget* lEmptyWidget = new QWidget();
m_dock1->setTitleBarWidget(lEmptyWidget);
delete lTitleBar;
//属性编辑器
// m_propertyWidget = PropertyService();
// m_propertyWidget->setWindowTitle("属性编辑器");
// m_propertyWidget->setParent(this);
// addDockWidget( Qt::TopDockWidgetArea, m_propertyWidget);
}
MainWindowCurve::~MainWindowCurve()
@ -295,14 +310,22 @@ void MainWindowCurve::s_Save()
//显示/隐藏图头
void MainWindowCurve::s_showHeadTable()
{
if(ui->tableWidget->isVisible())
if(m_dock1->isVisible())
{
ui->tableWidget->hide();
m_dock1->hide();
}
else {
ui->tableWidget->show();
m_dock1->show();
}
// if(ui->tableWidget->isVisible())
// {
// ui->tableWidget->hide();
// }
// else {
// ui->tableWidget->show();
// }
// QTableWidget *tableWidget = new QTableWidget();
// tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
@ -603,59 +626,60 @@ void MainWindowCurve::dropEvent(QDropEvent* event)
void MainWindowCurve::slotContextMenu(QPoint pos)
{
QMenu menu(ui->tableWidget);
QAction *newAction = menu.addAction("新建图头");
// 弹出菜单
QAction *selectedAction = menu.exec(ui->tableWidget->mapToGlobal(pos));
if (selectedAction == newAction) {
NewHeadDialog *dlg = new NewHeadDialog(this);
//
dlg->setAttribute(Qt::WA_DeleteOnClose);//关闭时,自动删除窗口对象
int result = dlg->exec();//模态对话框
if (result == QDialog::Accepted) {
// 处理用户点击了确定按钮的逻辑
qDebug() << "Accepted=";
// QMenu menu(ui->tableWidget);
// QAction *newAction = menu.addAction("新建图头");
// // 弹出菜单
// QAction *selectedAction = menu.exec(ui->tableWidget->mapToGlobal(pos));
// if (selectedAction == newAction) {
// NewHeadDialog *dlg = new NewHeadDialog(this);
// //
// dlg->setAttribute(Qt::WA_DeleteOnClose);//关闭时,自动删除窗口对象
// int result = dlg->exec();//模态对话框
// if (result == QDialog::Accepted) {
// // 处理用户点击了确定按钮的逻辑
// qDebug() << "Accepted=";
int rowcount = ui->tableWidget->rowCount(); //总行数
//增加1行
ui->tableWidget->setRowCount(rowcount+1);
//行标题
QTableWidgetItem *headerItem = new QTableWidgetItem("");
ui->tableWidget->setVerticalHeaderItem(rowcount, headerItem);
// int rowcount = ui->tableWidget->rowCount(); //总行数
// //增加1行
// ui->tableWidget->setRowCount(rowcount+1);
// //行标题
// QTableWidgetItem *headerItem = new QTableWidgetItem("");
// ui->tableWidget->setVerticalHeaderItem(rowcount, headerItem);
// int iWidth=0;
// //设置行高度
// ui->tableWidget->setRowHeight(rowcount, g_iRows*(g_iRowsHight+2)+1);
// if(rowcount==0)
// {
// iWidth=g_iCols*g_iColsWidth;
// //设置列宽
// ui->tableWidget->setColumnWidth(0, g_iCols*(g_iColsWidth+1)+1);
// }
// else
// {
// iWidth=ui->tableWidget->columnWidth(0);
// if(iWidth<g_iCols*g_iColsWidth)//列宽变大
// {
// iWidth=g_iCols*g_iColsWidth;
// //设置列宽
// ui->tableWidget->setColumnWidth(0, g_iCols*(g_iColsWidth+1)+1);
// }
// }
// //
// FormHead *widgetHead = new FormHead(this, 1);
// widgetHead->Init(g_iRows, g_iCols, iWidth);
// ui->tableWidget->setCellWidget(rowcount, 0, widgetHead);
// }
// else if (result == QDialog::Rejected) {
// // 处理用户点击了取消按钮的逻辑
// qDebug() << "Rejected=";
// }
// else {
// // 处理其他情况的逻辑
// qDebug() << "other=";
// }
// }
int iWidth=0;
//设置行高度
ui->tableWidget->setRowHeight(rowcount, g_iRows*(g_iRowsHight+2)+1);
if(rowcount==0)
{
iWidth=g_iCols*g_iColsWidth;
//设置列宽
ui->tableWidget->setColumnWidth(0, g_iCols*(g_iColsWidth+1)+1);
}
else
{
iWidth=ui->tableWidget->columnWidth(0);
if(iWidth<g_iCols*g_iColsWidth)//列宽变大
{
iWidth=g_iCols*g_iColsWidth;
//设置列宽
ui->tableWidget->setColumnWidth(0, g_iCols*(g_iColsWidth+1)+1);
}
}
//
FormHead *widgetHead = new FormHead(this, 1);
widgetHead->Init(g_iRows, g_iCols, iWidth);
ui->tableWidget->setCellWidget(rowcount, 0, widgetHead);
}
else if (result == QDialog::Rejected) {
// 处理用户点击了取消按钮的逻辑
qDebug() << "Rejected=";
}
else {
// 处理其他情况的逻辑
qDebug() << "other=";
}
}
// if(ui->tableWidget->rowCount()==0 && ui->tableWidget->rowCount()==0)
// {

View File

@ -4,6 +4,7 @@
#include <QMainWindow>
#include "formwell.h"
#include "geometryutils.h"
#include "formmultiheads.h"
#pragma execution_character_set("utf-8")
@ -41,10 +42,15 @@ public slots:
//鼠标滚动,通知可视解释窗口
void s_mouseWheel(QWheelEvent *event);
public:
QString m_strUuid;
QStringList m_listWell;
FormMultiHeads *m_formMultiHeads; //左侧工程区
QDockWidget *m_dock1;
public:
//展示所有井
void DisplayWells(QJsonArray wellsArray);