es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Dónde defino variables/objetos como QRegularExpression para ser utilizados en toda mi aplicación de Qt Widgets?

Estoy tratando de formalizar algunas expresiones regex para poder usarlas de manera más conveniente en toda mi aplicación basada en el widget de Qt. Puedo definirlas muy bien dentro de una ranura, pero no puedo descubrir dónde definirlas para un alcance más amplio.

Por lo general, puedo declarar una variable simple en el encabezado de la clase del nombre del marco principal y no tendré ningún problema.

Me encuentro con dos problemas con esto, uno siendo valores que necesitan un proceso para inicializarse (como un conjunto que necesita ser inicializado, “int a [i] = i para x” entre “foo” y “bar”), y el otro es QRegularExpression. Puedo definir cualquiera de esos en diferentes funciones / ranuras, pero no puedo descubrir dónde ponerlos para que puedan funcionar en toda la aplicación. No puedo inicializarlos como lo haría con un “int” o un “QString”.

Entiendo buscando en la documentación (y StackOverflow) que puede tener algo que ver con QShowEvent() y agregar estas funciones al “evento de muestra” de la ventana principal. Sin embargo, no entiendo cuál es el alcance de todo lo definido aquí.

Mi comprensión (tenue) es que la cosa regular QRegularExpression (“cosas”) es llamada efectivamente como una función, lo que parece ser la razón por la que no se sienta en el archivo de encabezado, que no “ejecuta”. Algo que ver con cómo se construye.

Sigo siendo un novato especialmente en el ámbito de “OOP adecuado”, así que puede faltar algunas cosas obvias aquí. Quizás un programador más experimentado crearía una clase para las estructuras de texto que quiero usar con estas funciones regex.

mainwindowname.h:

enum exampleenum {fo, oo, ba, r};

class mainwindowname:public QMainWindow
{
Q_OBJECT

public: …

private slots: …

private:

QRegularExpression re(“things”, QRegularExpression::CaseInsensitiveOption);

// esta línea no funciona aquí

exampleenum foofoo = fo;
int exampleint = 1;
QString qfoo;

// todos estos trabajan

};

en mainwindowname.cpp:

#include “mainwindowname.h”

void mainwindowname::oncosahappened()
{
QRegularExpression re(“cosas”, QRegularExpression::CaseInsensitiveOption);

// esto funcionará aquí
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para definir expresiones regulares que puedan ser utilizadas en toda una aplicación basada en Qt Widget, puede declararlas como variables estáticas en un archivo de encabezado de clase. Esto las hace accesibles a todas las funciones y ranuras dentro de esa clase, sin la necesidad de inicializarlas repetidamente.

    Por ejemplo:

    #ifndef MAINWINDOWNAME_H
    #define MAINWINDOWNAME_H
    
    #include <qregularexpression>
    
    class MainWindowName : public QMainWindow
    {
        Q_OBJECT
    
    public:
        ...
    
    private slots:
        ...
    
    private:
        ...
    
        // Variable estática que es accesible en toda la clase
        static const QRegularExpression re;
    
        ...
    };
    
    #endif // MAINWINDOWNAME_H
    

    Luego, en el archivo fuente correspondiente, puede definir las expresiones regulares de la siguiente manera:

    #include "mainwindowname.h"
    
    // Inicialize la variable estática
    const QRegularExpression MainWindowName::re("cosas", QRegularExpression::CaseInsensitiveOption);
    
    ...
    
    void MainWindowName::on_thing_happened()
    {
        // Usa la expresión regular
        qDebug() << "Coincidencia: " << re.match("alguna cadena");
    }
    
    ...
    

    Al definir las expresiones regulares como variables estáticas en el archivo de encabezado de la clase y en su inicialización en el archivo fuente, puede usarlas en toda la clase sin tener que preocuparse por inicializarlas repetidamente en diferentes funciones o ranuras.

Comments are closed.