CCompare la descripción de la interfaz de desarrollo secundaria

ccompare.dll admite la función de desarrollo secundario de comparar archivos, comparar y sincronizar archivos de formato de texto.

Descripción ambiental

Descripción del entorno de la biblioteca de desarrollo: QT 

El entorno de desarrollo de la versión de la biblioteca de prueba es: QT5.12.10, compilador VS (2017 v141 versión comunitaria). En teoría, solo necesita la versión de su entorno QT de desarrollo para que sea coherente con la versión de la biblioteca de CCompare.dll. La versión VS es la cadena de herramientas vs2017 (v141) utilizada durante las pruebas.

Al probar y desarrollar, preste atención a la versión de qt que está utilizando actualmente, que es consistente con la versión de qt compilada por el binario actual ccompare.dl; de lo contrario, puede haber problemas con la compilación y la vinculación. Si su versión de qt no es qt5.12.10, puede instalar qt5.12.10 primero y pasar la prueba.

Ruta de ejemplo de código de prueba: https://gitee.com/cxasm/cc-compare.git

vs configuración del entorno:

En el directorio ccompare del proyecto de prueba, hay cuatro archivos ccmp.h blockuserdata.h ccompare.dll ccompare.lib, que son los archivos de la biblioteca de desarrollo secundaria y los archivos de encabezado de la versión de lanzamiento. Establezca el directorio de inclusión y el directorio de la biblioteca en vs, y configúrelos en el directorio ccompare en el código de muestra. La configuración vs se muestra en la siguiente figura.

Características

1 función de comparación y sincronización

Vea la función compareSyncFile en el código, solo necesita llamar a esta interfaz, ingresar los dos parámetros de ruta de archivo para procesar, y la comparación se completará y mostrará automáticamente. La sincronización se puede realizar en la ventana emergente. Este tipo de escena es relativamente tonta, y la interfaz de comparación y sincronización se completa directamente, que se usa en escenas que deben compararse y sincronizarse. La ejecución de prueba en el código de ejemplo es la siguiente:

Después de comparar la interfaz de operación síncrona, es la siguiente:

 Si tiene requisitos personalizados para la interfaz de sincronización, busque desarrollo secundario.

2 Función de comparación

Vea la función compareFile en el código , solo necesita llamar a esta interfaz, ingresar los dos archivos a procesar, se comparará automáticamente y se dará el resultado de la comparación. Una vez que los usuarios obtienen los resultados de la comparación, pueden hacer su propia representación y visualización personalizada. ccompare.dll se usa para completar el complejo proceso de comparación y el algoritmo, y puede mostrar de manera flexible algunas partes definidas por el usuario. Este método es más flexible y es más común usar escenarios en el desarrollo secundario.

En el ejemplo de prueba, después de obtener el resultado de la comparación,  se realiza una visualización personalizada simple en la devolución de llamada de on_cmpSuccess . Las reglas de visualización personalizadas son: 1) Las mismas partes se muestran en negro. 2) Las diferentes partes se resaltan en rojo 3) Las diferentes líneas se indican con [x] delante de ellas. 4) Utilice [pad] delante de la línea de alineación. Basándose en este sencillo ejemplo, los usuarios pueden personalizar completamente las reglas para cumplir con sus propios efectos de visualización. La ejecución de prueba en el código de ejemplo es la siguiente:

 Después de la comparación, el efecto de visualización personalizado del ejemplo de prueba es el siguiente:

Desarrollar una descripción detallada de la interfaz

1 Interfaces síncronas contrastantes

void  compareSyncFile( QString  rutaizquierda , QString  rutaderecha );

Descripción del parámetro: leftPath es la ruta del archivo de texto a la izquierda y rightPath es la ruta del archivo de texto a la derecha.

Instrucciones de uso:

CCmp * pcmp = nuevo  CCmp ( este );

// El método de llamada de sincronización de archivos, aparecerá una interfaz de comparación, que se puede sincronizar

pcmp->compareSyncFile(QString( ".//archivo de prueba/1.txt" ), QString( ".//archivo de prueba/2.txt" ));

Después de la ejecución, aparecerá la interfaz de comparación y sincronización de la figura anterior.

Tenga en cuenta que el objeto pcmp es el objeto principal de la nueva ventana emergente; si elimina pcmp, la ventana de sincronización también se cerrará.

Preferiblemente donde sea necesario CCmp * pcmp = new  CCmp ( this );

Luego destruya pcmp cuando la ventana principal esté cerrada. Esta parte es el conocimiento de qt. Suponemos que está familiarizado con el conocimiento de QT/C++ y no lo explicará.

2 interfaz de comparación

QObject * compareFile( QString  rutaizquierda , QString  rutaderecha );

Descripción del parámetro: leftPath es la ruta del archivo de texto a la izquierda y rightPath es la ruta del archivo de texto a la derecha.

Valor de retorno: QObject* es un objeto de comparación interno, y su objeto principal QT es el pcmp recién creado anteriormente, que se puede liberar manualmente y se reciclará automáticamente cuando se destruya pcmp. Si usa un objeto pcmp y llama a la función compareFile muchas veces, cada llamada ocupará un objeto de comparación. Para reducir la sobrecarga de memoria, puede eliminar y liberar manualmente el valor devuelto una vez que se completa el proceso de comparación.

Instrucciones de uso:

CCmp * pcmp = nuevo  CCmp ( este );

//La forma de comparación de archivos, después de obtener las diferencias usted mismo, realice una representación y visualización personalizada. Cuando se completa la comparación, se emite la señal cmpResult

connect(pcmp, & CCmp ::cmpFinished, this , & QtWidgetsApplication1 ::on_cmpSuccess);

pcmp->compareFile( QString ( ".//archivo de prueba/1.txt" ), QString ( ".//archivo de prueba/2.txt" ));

El usuario necesita manejar la señal cmpFinished por sí mismo, y el resultado está en la función de señal.

2.1 Señales cmp  Descripción de la función de señal finalizada 

void  cmpFinished( int  resultType , QStringList * leftContents , QStringList * rightContents , QVector < UnequalCharsPosInfo >* leftUnequalInfo , QVector < UnequalCharsPosInfo >* rightUnequalInfo , const  QList < BlockUserData *>* leftBlockData , const  QList < BlockUserData *>* rightBlockData );

Descripción del parámetro: tipo de retorno resultType . 0 significa que la comparación está completa; 1 significa que no se necesita ninguna comparación y que el contenido real de un archivo está vacío. 

QStringList* leftContents: el contenido de cada línea de la izquierda. 

QStringList* rightContents: el contenido de cada línea de la derecha.

Los dos parámetros anteriores devuelven el contenido de cada fila en el resultado de la comparación, y el usuario puede obtener cada fila por sí mismo y luego mostrarla.

Tenga en cuenta que QString usa la codificación utf16, y la interfaz toutf8() debe usarse para generar el contenido de QString en una cadena codificada en utf8 para su visualización. Los siguientes intervalos de diferentes bloques se miden según la longitud de la codificación utf8. Asegúrese de usar la codificación utf8 para todos.

QVector<UnequalCharsPosInfo>* leftUnequalInfo: Diferentes intervalos del contenido de la izquierda

QVector<UnequalCharsPosInfo>* rightUnequalInfo: Diferentes intervalos del contenido de la derecha

Como se mencionó anteriormente, el contenido de cada fila está en leftContents, pero hay diferentes partes y los usuarios de estas partes deben poder conocer sus posiciones correspondientes. leftUnequalInfo representa el intervalo de cada bloque distinto. Tenga en cuenta que el intervalo interior es del contenido general, no solo de una determinada línea.

Necesitamos obtener el contenido de todo el contenido utf8 primero, de la siguiente manera:

QString textoizquierdo = contenidoizquierdo->join( "" );

QByteArray leftUtf8Chars = textoizquierdo.toUtf8();

Luego, el valor del intervalo de leftUnequalInfo es el rango representado por leftUtf8Chars. Preste atención a la conversión aquí.

Si desea obtener información sobre diferentes intervalos en una fila, en relación con la fila misma, puede consultar la función getUnEqualBlock en el ejemplo . Esta función realizará una conversión relativa en el rango y devolverá el rango de diferentes bloques en la fila.

const QList<BlockUserData*>* leftBlockData: el estado de los resultados de la comparación de cada fila a la izquierda

const QList<BlockUserData*>* rightBlockData: el estado de los resultados de la comparación de cada fila a la derecha

La descripción del estado de cada fila, tenga en cuenta que hay un BlockUserData para cada fila, que indica el estado del resultado de la comparación de la fila, ya sea una fila relativa, una fila desigual o una fila alineada . BlockUserData se define en la función blockuserdata.h. Solo preste atención a la variable int m_blockType. El estado de la fila se indica mediante el siguiente valor de enumeración BLOCKSTATUS . El último TEMP_INSERT_BLOCK no necesita preocuparse externamente y se usa internamente.

enumeración BLOCKSTATUS {

UNKNOWN_BLOCK = 0, // desconocido

EQUAL_BLOCK = 1, //igual

UNEQUAL_BLOCK, // no es igual

PAD_BLOCK, //alineación

LAST_PAD_EMPTY_BLOCK, // La última línea vacía para la alineación, solo es posible en la última línea

TEMP_INSERT_BLOCK //bloque de inserción temporal

};

Para obtener información detallada sobre el uso, consulte la función on_cmpSuccess en el código de ejemplo.

Instrucciones de liberación de parámetros: no es necesario liberar todos los parámetros por sí mismos; el marco manejará la liberación por sí mismo; y no modifique los valores de los parámetros de la función.

3 Descripción de la clase de interfaz

typedef  struct  UnequalCharsPosInfo_  {

int  start;  //inicia el desplazamiento de diferentes bloques

int  length;  //longitud de diferentes bloques

} UnequalCharsPosInfo ;

clase  CC_EXPORT  CCmp  : QObject público 

{

Q_OBJETO

público :

CCmp( QObject * padre = nullptr );

virtual  ~CCmp();

void  setCmpMode( int  mode ); //0 valor predeterminado, ignora los caracteres en blanco antes y al final de la línea 1: ignora solo los caracteres en blanco al final de la línea 2: ignora todos los caracteres en blanco antes , durante y al el final de la línea .

void  setCmpParameter( bool  isBlankLineDoMatch , int  lineMatchEqualRata ); //Compara parámetros. // isBlankLineDoMatch Si las líneas en blanco participan en la comparación , el valor predeterminado es verdadero ; 

// lineMatchEqualRata La tasa de similitud de líneas identificadas como iguales es 50 por defecto , cuanto mayor sea el valor, más estricta será la coincidencia, se recomienda 50-90.

// Comparar y sincronizar archivos .

void  compareSyncFile( QString  rutaizquierda , QString  rutaderecha );

// Solo compare archivos, y el resultado de la comparación se emitirá como señal cmpResult . La comparación de resultados se realiza de forma asíncrona.

QObject * compareFile( QString  rutaizquierda , QString  rutaderecha );

señales :

void  cmpFinished( int  resultType , QStringList * leftContents , QStringList * rightContents , QVector < UnequalCharsPosInfo >* leftUnequalInfo , QVector < UnequalCharsPosInfo >* rightUnequalInfo , const  QList < BlockUserData *>* leftBlockData , const  QList < BlockUserData *>* rightBlockData );  // comparación La señal completa debe conectarse a la señal y el usuario presenta el resultado de la comparación en su propia función de ranura. Solo con compareFileUso de la interfaz; compareSyncFile no activa la señal.

};

Nuevamente: este ejemplo se prueba en el entorno qt5.12.10, y la biblioteca dinámica y Lib se desarrollan en base a qt5.12.10.

El compilador es vs2017. Puede soportar el sistema Linux. Ruta de ejemplo de código de prueba: https://gitee.com/cxasm/cc-compare.git

Supongo que te gusta

Origin blog.csdn.net/peterbig/article/details/127370575
Recomendado
Clasificación