QT - Texto en QT

   
Vista:

Texto en QT

Publicado por Tormund (19 intervenciones) el 03/01/2015 07:24:21
Buenas a todos,

Me encuentro desarrollando una herramienta que permita copiar al portapapeles con el clipboard, actualmente el programa funciona, pero me gustaría poder almacenar el texto que copio en el clipboard en vez de ser un Qstring a un .txt que cualquiera pueda editar. Sabéis como podría hacerlo? no hago mas que buscar y probar sin lograr que funcione.

En resumen es que copie al portapapeles el contenido de un archivo .txt.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Texto en QT

Publicado por juanki (67 intervenciones) el 03/01/2015 17:16:55
Hola

Una vez tengas el contenido del portapapeles en un QString nada te impide guardarlo en un archivo, tienes la clase QFile que te puede ayudar:
http://doc.qt.io/qt-5/qfile.html

O también puedes hacerlo con las funciones de C++ estándar.

También puedes usar un QTextEdit y le muestras diréctamente el texto al usuario para que lo edite y le pones un botón para que lo guarde cuando quiera:
http://doc.qt.io/qt-5/qtextedit.html

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund tormund1985@gmail.com (19 intervenciones) el 03/01/2015 18:01:06
Buenas podrías ponerme un ejemplo de código para que un Qtestedit muestre el contenido de un txt en el raiz? No consigo hacerlo.

Gracias de antemano
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por juanki (67 intervenciones) el 04/01/2015 00:16:34
Hola

Si miras la documentación de Qt verás que no es muy complicado, en los enlaces que te pasé vienen hasta pequeños ejemplos, básicamente tienes que abrir el archivo y como quieres poner todo su contenido en el QtextEdit, puedes usar el método readAll() y listo, vamos, algo así:

1
2
3
4
5
6
QString nombreArchivo = QFileDialog::getOpenFileName(this,"Abrir Archivos","/home","Archivos TXT (*.txt)");
    if(!nombreArchivo.isEmpty()) {
        QFile archivo(nombreArchivo);
        if(archivo.open(QFile::ReadOnly))
            ui->textEdit->setPlainText(archivo.readAll());
    }

En ese pequeño ejemplo textEdit es el nombre del QTextEdit que mostrará el contenido del archivo y uso la clase QFileDialog para seleccionar el archivo a abrir.

Como ves, es muy simple. siempre recomiendo que, además de a programar, hay que aprender a mirar la documentación, te ayudará mucho.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 04/01/2015 11:41:49
Buenas,

Muchas gracias por tu ayuda. Lo cierto es que únicamente he programado en C y fue hace mas de 10 años, tengo hechas pequeñas aplicaciones en Python y Qt por lo fácil que es el desarrollo de entornos gráficos, pero hace 3 años que no hago absolutamente nada y me esta costando hacer esta tontería.

En el código que muestras hay variables que no tengo claras, a ver, donde pones "archivo" se refiere al .txt que quiero que copie al textedit con el readAll pero sin su extensión .txt. Podría ser algo así?

void MainWindow::on_textEdit_destroyed()
{
QString prueba = QFileDialog::getOpenFileName(this,"Abrir Archivos","/home","Archivos TXT (*.txt)");
if(!prueba.isEmpty())
{
QFile ejemplo(prueba);
if(ejemplo.open(QFile::ReadOnly))
ui->textEdit->setPlainText(ejemplo.readAll());
}
}

ejemplo.txt es el documento que quiero copiar.

Estas semanas me dedicaré a volver a ponerme con los manuales de QT que me encuentro francamente oxidado.

Gracias de nuevo por tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 04/01/2015 16:06:34
Conseguido!

QClipboard *clipboard = QApplication::clipboard();
QFile a("ejemplo.txt");
if(a.open(QFile::ReadOnly))
ui->incidencias_qtext->setPlainText(a.readAll());

Así es como quería que trabajase, ahora solo tengo que guardar en ese archivo lo que modifique, continuaré peleando. Muchísimas gracias por tu ayuda!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por juanki (67 intervenciones) el 04/01/2015 17:39:34
Ante todo, estupendo que lo conseguiste :)

Ese "archivo" es el nombre que yo le di a la variable QFile, en el código que pusiste tu le llamaste "ejemplo", el nombre del archivo se obtiene en la primera línea y es el que se seleccione en la ventana que se abre y va a parar a la variable "nombreArchivo"

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 04/01/2015 17:45:32
Si tras verlo bien ya lo interpreté, ahora encuentro un poco atascado para que clipboard copie el contenido del qtext

ui->incidencias_qtext->setPlainText(a.readAll());
clipboard->setText(a.readAll());

Entiendo que sería de esta manera por la documentación que he leído pero no logro que funcione. No tengo problema si le indico el texto:
clipboard->setText("UTC SALGO DE GUARDIA DEL PUESTO DE OPERACION 1 DE MF/HF. SIN NOVEDAD.");

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por juanki (67 intervenciones) el 04/01/2015 19:50:47
Hola

bueno, ahí el problema ya es otro, si pones estas dos líneas:

1
2
ui->incidencias_qtext->setPlainText(a.readAll());
clipboard->setText(a.readAll());

en la primera, tras leer el archivo con readAll, el puntero de lectura se sitúa al final del archivo, por tanto, al hacer el segundo readAll no lee nada, ya que está al final, una solución es volver a poner el puntero de lectura al principio del archivo, que puedes hacerlo con el método reset:

1
a.reset()

O bien, ya que has leído el archivo y lo tienes en el QTextEdit, pues copiarlo directamente de ahí al portapapeles:
1
clipboard->setText(ui->textEdit->toPlainText());

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 04/01/2015 21:29:50
Es justo ahí donde fallaba, desconocía el reset. Ahora funciona a la perfección. Los cambios ya conseguí hacerlos mediante QFile.

QFile file("predefinidos_incidencias.txt");
if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
return;
QTextStream out(&file);
out << ui->incidencias_qtext->toPlainText();

Lo que no veo y ha de ser una tontería es abrir documento tipo .pdf, .txt de dentro del directorio.

Muchas gracias por tu ayuda! Ya casi lo tengo ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por juanki (67 intervenciones) el 05/01/2015 21:26:49
El .pdf es más complicado, Qt no incluye (creo) clases para leer ese formato de archivo, por lo que tendrás que buscar una librería que lo haga, no es tan sencillo como un .txt.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 05/01/2015 22:33:48
No quiero que lo lea, realmente lo único que quiero es que abra el documento como si un acceso directo se tratara, ya sea un excel, exe, txt etc. En c creo recordar saber hacerlo pero aquí no encuentro nada en la documentación. Seguiré buscando. Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por juanki (67 intervenciones) el 06/01/2015 13:15:05
Bueno, si solo quieres mostrarlo puedes hacer uso de QDesktopServices::openUrl, que te lo abrirá en el programa por defecto que tengas instalado, algo así:

1
2
3
4
5
QString nombreArchivo = QFileDialog::getOpenFileName(this, "Abrir Archivos", "/home", "Archivos PDF (*.pdf)");
 
nombreArchivo.prepend("file:///");
 
QDesktopServices::openUrl(QUrl(nombreArchivo));

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 06/01/2015 20:10:52
Genial, por fin funciona, finalmente no era necesaria la clase QFileDialog.

QString nombreArchivo;
nombreArchivo.prepend("copia_incidencias.txt");
QDesktopServices::openUrl(QUrl(nombreArchivo));

Esta semana tengo difícil hacer algo por trabajo, pero espero terminarlo pronto. Muchísimas gracias ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por juanki (67 intervenciones) el 07/01/2015 00:08:24
Estupendo!!

Esa clase te la puse como ejemplo, pero si el archivo que vas a abrir es siempre el mismo pues no, no la necesitas.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 10/01/2015 13:21:25
Buenas de nuevo,

Finalmente he decidido implementarle unas cuantas cosas a la app. Me encuentro ahora atascado con el QmouseEvent. La cuestión es la siguiente, Quiero que cuando pulse un qpushbutton realice una tarea, bien, pero cuando haga un doble click o un boton derecho SOBRE DICHO qpushbutton, haga otra. He logrado hacer la tarea al pulsar boton derecho, pero no sobre mi qpushbutton. A ver si puedes ayudarme.

El código en cuestión es éste:

1
2
3
4
5
6
7
8
9
void MainWindow::mousePressEvent(QMouseEvent * event)
{
if (event->button() == Qt::RightButton)
{
Qstring x;
x.prepend ("Predefinidos");
QDesktopServices::openUrl(QUrl(x);
}
}

Tengo claro que con este código no voy a hacer que funcione sobre mi QpushButton sino en todo el main ya que no lo menciono en ninguna parte, pero es que no se donde tendría cabida en el código y ya hice 40 pruebas.

Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por juanki (67 intervenciones) el 12/01/2015 22:56:02
Hola

Doble click en un botón... No tiene ninguna señal que lo haga, no sé como se podría hacer, pero de todas formas no sé, quizás tendrías que plantear un nuevo enfoque, igual es más fácil. ¿Por que doble click? ¿No puedes hacer un menú contextual o algo?

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 13/01/2015 10:26:14
De acuerdo, si me lo confirmas desisto. Veré a ver para crear un menú, lo único que quiero es que edite, así que con un solo menú me basta. Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por juanki (67 intervenciones) el 13/01/2015 19:27:58
Hola

Bueno, no digo que no pueda hacerse, solo miré y la clase QPushButton no tiene ninguna señal que responda al doble click, haber habrá alguna manera.

Pero no me parece "intuitivo", la aplicación debe ser fácil de usar y la verdad, doble click en un botón no es lo que uno espera, si quieres una opción para "editar", igual te conviene más crear un menú que se abra cuando pulsas el botón derecho sobre dicho elemento y ahí poner las opciones adecuadas. Es más "estándar" que doble click sobre un botón.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 15/01/2015 03:36:51
Buenas juanki,

Sigo dándome de bruces con el asunto, a ver, quiero que al presionar el boton derecho despliegue un menu con la única opcion de editar un .txt. Bien, podría hacerlo con un customContextMenuRequested, ShowContextMenu o con el contextMenuEvent? Ya he probado con todas y con ninguna logre hacerlo funcionar...

Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por juanki (67 intervenciones) el 16/01/2015 19:16:08
Hola

Para mostrar un menú que se despliegue al pulsar el botón derecho puedes hacerlo, por ejemplo, usando QAction, para ello tienes que cambiar el ContextMenuPolicy del widget que quieres que despliegue el menú, por ejemplo algo así para mostrar un menú personalizado que se abre al pulsar el botón derecho sobre un QLineEdit;

1
2
3
4
5
ui->lineEdit->setContextMenuPolicy(Qt::ActionsContextMenu);
    QAction *miOpcion = new QAction("Mi Opción", this);
    ui->edTexto->addAction(miOpcion);
 
    connect(miOpcion, SIGNAL(triggered()), this, SLOT(miSlot()));

Tienes que crear también el SLOT con el que conectar la señal.

Por cierto, para una pregunta nueva, abre un hilo nuevo :)

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 18/01/2015 00:21:45
De acuerdo, la proxima abro un nuevo hilo. Si hago lo que has puesto, crearía un menu Editar con cada click que haga sobre ese QPushbutton. Se te ocurre como evitarlo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 18/01/2015 00:58:36
Solucionado, tan fácil como ponerlo en el Main.
Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 13/05/2015 05:16:24
Retomo este viejo hilo por un problema que me he encontrado al migrar la aplicacion a Windows, y es que el codigo:

1
2
3
QString nombreArchivo;
nombreArchivo.prepend("copia_incidencias.txt");
QDesktopServices::openUrl(QUrl(nombreArchivo));

En windows no funciona sin embargo en Linux sin ningún problema, al parecer no reconoce el path relativo, solo funciona si lo pongo como absoluto, cosa que no me vale para lo que quiero.

He probado con fromlocalfile y otras sentencias pero no doy con la solución.

Gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Texto en QT

Publicado por Tormund (19 intervenciones) el 13/05/2015 06:04:03
Tras toda una noche intentandolo, por fin conseguido:

1
2
QString ruta = QCoreApplication::applicationDirPath();
QDesktopServices::openUrl(QUrl::fromLocalFile(ruta + "2.txt");

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar