Qt: abrir un archivo personalizado haciendo doble clic

Tengo un programa y un archivo .l2p con algunas líneas de información. He ejecutado un archivo de registro:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.l2p\DefaultIcon]
@="\"C:\\Program Files\\ToriLori\\L2P.exe\",0"

[HKEY_CLASSES_ROOT\.l2p\shell\Open\command]
@="\"C:\\Program Files\\ToriLori\\L2P.exe\" \"%1\""

Cuando hago doble clic en el archivo .l2p, el programa se inicia pero no carga el archivo. ¿Qué tengo que hacer para que cargue correctamente? El código de ejemplo sería muy apreciado.

preguntado el 12 de junio de 12 a las 11:06

2 Respuestas

Cuando hace doble clic en un archivo, el nombre del archivo se pasa como un argumento de línea de comando al programa asociado. Debe analizar la línea de comando, obtener el nombre del archivo y abrirlo (cómo hacerlo depende de cómo funcione su programa).

#include <iostream>

int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; ++i) {
        std::cout << "The " << i << "th argument is " << argv[i] << std::endl;
    }
}

Si ejecuta este programa desde la línea de comandos:

>test.exe "path/to/file" "/path/to/second/file"
The 1th argument is path/to/file
The 2th argument is /path/to/second/file

En Qt, si crea una QApplication, también puede acceder a los argumentos de la línea de comando a través de QCoreApplications::argumentos().

Es posible que desee cargar el archivo después de haber creado su ventana principal. Puedes hacer algo como esto:

#include <QApplication>
#include <QTimer>

#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow window;

    QTimer::singleShot(0, & window, SLOT(initialize()));

    window.show();

    return app.exec();
}

De esta manera la ranura MainWindow::initialize() (que debe definir) se llama tan pronto como se inicia el ciclo de eventos.

void MainWindow::initialize()
{
    QStringList arguments = QCoreApplication::arguments();
    // Now you can parse the arguments *after* the main window has been created.
}

Respondido el 12 de junio de 12 a las 13:06

En mi proyecto, ya nos habíamos encargado de la asociación de archivos de Windows y solo necesitaba agregar el procesamiento de argumentos de la línea de comandos. No estaba del todo claro cómo, o más específicamente CUÁNDO, desencadenar esta acción dentro del ciclo de vida de la aplicación Qt: Desde dentro main después de window.show()... o con algunos onLoad evento en la ventana... o que??? Esta respuesta me puso en el camino correcto. ¡Gracias! - aldo

¿Cómo se abren los nombres de archivos Unicode con esto? - Dmitriy

Si estoy entendiendo bien tu pregunta, L2P.exe es un programa Qt que creó y desea manejar un argumento pasado como si especificara un archivo para abrir. Si ese es el caso, solo necesita leer ese argumento en su main() método y manejarlo. (Esto no es algo que suceda automáticamente). Algo como lo siguiente, aunque obviamente desea agregar un poco de verificación de errores:

int main(int argc, char *argv[]) {
  QApplication a(argc, argv);

  const QStringList arguments = a.arguments();

  // The final argument is assumed to be the file to open.
  if (arguments.size() > 1 && QFile::exists(arguments.last())) {
    your_app_open(arguments.last());
  }

  // ... etc.
}

Respondido el 12 de junio de 12 a las 13:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.