Esta serie de tutoriales son una copia de lo ya traducido en TechBase por mi. En dicha página puedes encontrar la versión original y la versión traducida al español.
Contenido
- Resumen
- El código
- main.cpp
- mainwindow.h
- mainwindow.cpp
- tutorial4ui.rc
- Explicación
- Añadir las acciones
- Crear un nuevo documento
- Guardar un archivo
- saveFileAs(QString)
- saveFileAs()
- saveFile()
- Cargar un archivo
- Make, instalar y ejecutar
- CMakeLists.txt
- Avanzando
Resumen
Ahora que tenemos una interfaz básica del editor de textos, es hora de añadirle funcionalidad. Básicamente, un editor de textos debe abrir archivos desde disco, guardar archivos que has creado/editado y crear nuevos archivos.
KDE proporciona algunas clases para trabajar con archivos que hacen la vida mucho mas fácil a los desarrolladores. La biblioteca KIO te permite fácilmente tener acceso a archivos a través de protocolos de red transparentes, así como mediante cuadros de dialogo estándar.

El código
main.cpp
- #include <KApplication>
- #include <KAboutData>
- #include <KCmdLineArgs>
- #include "mainwindow.h"
- int main (int argc, char *argv[])
- {
- KAboutData aboutData( "tutorial4", "tutorial4",
- ki18n("Tutorial 4"), "1.0",
- ki18n("A simple text area which can load and save."),
- KAboutData::License_GPL,
- ki18n("Copyright (c) 2008 Developer") );
- KCmdLineArgs::init( argc, argv, &aboutData );
- KApplication app;
- MainWindow* window = new MainWindow();
- window->show();
- return app.exec();
- }
mainwindow.h
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <KXmlGuiWindow>
- #include <KTextEdit>
- class MainWindow : public KXmlGuiWindow
- {
- Q_OBJECT //nuevo respecto al tutorial3
- public:
- private:
- KTextEdit* textArea;
- void setupActions();
- private slots: //nuevo
- void newFile(); //nuevo
- void openFile(); //nuevo
- void saveFile(); //nuevo
- void saveFileAs(); //nuevo
- };
- #endif
También queremos llevar un registro del nombre del archivo abierto actual, por lo que declaramos QString fileName.
mainwindow.cpp
- #include "mainwindow.h"
- #include <KApplication>
- #include <KAction>
- #include <KLocale>
- #include <KActionCollection>
- #include <KStandardAction>
- #include <KFileDialog> //nuevo
- #include <KMessageBox> //nuevo
- #include <KIO/NetAccess> //nuevo
- #include <KSaveFile> //nuevo
- #include <QTextStream> //nuevo
- : KXmlGuiWindow(parent),
- {
- textArea = new KTextEdit;
- setCentralWidget(textArea);
- setupActions();
- }
- void MainWindow::setupActions()
- {
- KAction* clearAction = new KAction(this);
- clearAction->setText(i18n("Limpiar"));
- clearAction->setIcon(KIcon("document-new"));
- clearAction->setShortcut(Qt::CTRL + Qt::Key_W);
- actionCollection()->addAction("limpiar", clearAction);
- connect(clearAction, SIGNAL(triggered(bool)),
- textArea, SLOT(clear()));
- KStandardAction::quit(kapp, SLOT(quit()),
- actionCollection());
- KStandardAction::open(this, SLOT(openFile()),
- actionCollection()); //nuevo
- KStandardAction::save(this, SLOT(saveFile()),
- actionCollection()); //nuevo
- KStandardAction::saveAs(this, SLOT(saveFileAs()),
- actionCollection()); //nuevo
- KStandardAction::openNew(this, SLOT(newFile()),
- actionCollection()); //nuevo
- setupGUI();
- }
- //Nuevo de aqui en adelante
- void MainWindow::newFile()
- {
- fileName.clear();
- textArea->clear();
- }
- {
- KSaveFile file(outputFileName);
- file.open();
- QByteArray outputByteArray;
- outputByteArray.append(textArea->toPlainText().toUtf8());
- file.write(outputByteArray);
- file.finalize();
- file.close();
- fileName = outputFileName;
- }
- void MainWindow::saveFileAs()
- {
- saveFileAs(KFileDialog::getSaveFileName());
- }
- void MainWindow::saveFile()
- {
- if(!fileName.isEmpty())
- {
- saveFileAs(fileName);
- }
- else
- {
- saveFileAs();
- }
- }
- void MainWindow::openFile()
- {
- QString tmpFile;
- if(KIO::NetAccess::download(fileNameFromDialog, tmpFile, this))
- {
- fileName = fileNameFromDialog;
- KIO::NetAccess::removeTempFile(tmpFile);
- }
- else
- {
- KMessageBox::error(this, KIO::NetAccess::lastErrorString());
- }
- }
tutorial4ui.rx
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
- <gui name="tutorial4" version="1">
- <ToolBar name="mainToolBar" >
- <text>Main Toolbar</text>
- <Action name="limpiar" />
- </ToolBar>
- <MenuBar>
- <Menu name="file" >
- <Action name="limpiar" />
- </Menu>
- </MenuBar>
- </gui>
Explicación
Bien, ahora vamos a implementar el código que realizará el trabajo de cargar y guardar. Esto se lleva a cabo en mainwindow.cpp.
Lo primero que hacemos es añadir
Añadir las acciones
La primera cosa que vamos a hacer es proporcionar al usuario la interfaz para decirle a la aplicación que cargue o guarde un archivo. Como ya hicimos con la acción quit en el tutorial 3, usaremos KStandardActions. En las lineas 37-47 añadimos las acciones de la misma manera que la acción quit. Para cada una de ellas, la conectamos que el slot apropiado que hemos declarado en el archivo cabecera.
Crear un nuevo documento
La primera función que hemos definido es newFile():
{
fileName.clear();
textArea->clear();
}
Guardar un archivo
saveFileAs(QString)
Ahora vamos a escribir nuestro primer código que maneje archivos. Vamos a implementar una función que guardará el contenido del área de texto en un archivo con un nombre pasado como parámetro. KDE proporciona una clase llamada KSaveFile para guardar archivos de manera segura, que hereda de la clase de Qt QFile.
El prototipo de la función es:
file.open();
Ahora que tenemos nuestro QByteArray, lo usamos para escribir el archivo con KSaveFile::write(). Si estuvieramos usando un QFile, los cambios se reflejarían inmediatamente. Sin embargo, si se ha producido un problema parcial en la escritura, el archivo podría estar corrupto. Por esta razón, KSaveFile escribe primero en un archivo temporal y luego, en la llamada KSaveFile::Finalize, refleja los cambios en el archivo actual.
file.finalize();
file.close();
saveFileAs()
Esta es la función a la que está conectado el slot saveAs. Simplemente llama a la función genérica saveFileAs(QString) pasandole el nombre del fichero devuelto por KFileDialog::getSaveFileName().
{
saveFileAs(KFileDialog::getSaveFileName());
}
saveFile()
{
if(!fileName.isEmpty())
{
saveFileAs(fileName);
}
else
{
saveFileAs();
}
}
Cargar un archivo
Por último, el tutorial 4 debe ser capaz de cargar archivos desde disco. El código para llevarlo a cabo se encuentra en la función MainWindow::openFile().
Primero debemos preguntar al usuario por en nombre del archivo que desea abrir. Esto lo hacemos usando otra de las funciones de KFileDialog, getOpenFileName():
La función devuelve true o false dependiendo si la transferencia tuvo exito. Si falló, mostraremos un mensaje informando del error:
Creamos un QFile pasando a su constructor el archivo temporal creado por NetAccess::download() y lo abrirmos en modo de solo lectura:
A continuación almacenamos la ruta de acceso del archivo que acabamos de abrir:
Make, instalar y ejecutar
CMakeLists.txt
- project(tutorial4)
- find_package(KDE4 REQUIRED)
- include_directories(${KDE4_INCLUDES})
- set(tutorial4_SRCS
- main.cpp
- mainwindow.cpp
- )
- kde4_add_executable(tutorial4 ${tutorial4_SRCS})
- target_link_libraries(tutorial4 ${KDE4_KDEUI_LIBS}
- ${KDE4_KIO_LIBS})
- install(TARGETS tutorial4 DESTINATION ${BIN_INSTALL_DIR})
- install(FILES tutorial4ui.rc
- DESTINATION ${DATA_INSTALL_DIR}/tutorial4)
Con este archivo, puede construirse y ejecutar el tutorial de la misma forma que el tutorial 3. Para mas información, ve al tutorial 3.
- mkdir build && cd build
- cmake .. -DCMAKE_INSTALL_PREFIX=$HOME
- make install
- $HOME/bin/tutorial4
Avanzando
Ahora puedes continuar con el Tutorial 5 - KCmdLineArgs.
- Inicie sesión o regístrese para enviar comentarios



Gracias por vuestro trabajo.
Se que todo cuesta tiempo y trabajo, y que muchas veces pedimos más y más.
Ahora quería hacer una sugerencia: podeis poner los tutoriales tambien en pdf, así se pueden descargar y guardar, quizás con el tiempo se podría hacer un libro con los diversos capítulos. Guardarlo tal como sale en la pantalla (versión html) no es muy estético si posteriormente se encuaderna como libro.
Gracias por todo.
Buena idea, €18 el libro de
Buena idea, €18 el libro de KDE Hispano, con guias de programación, un cd y un calendario con fotos de edumardo semi desnudo.
Puede funcionar
Siempre hay gente (yo uno de ellos) que prefiere tener documentación escrita, y creo que sobre programación KDE4 en español no debe haber nada o casi nada.
Depende del libro, puede ser una buena opción.
Se puede hacer
No es muy difícil una vez hecho el tutorial exportarlo a pdf. Creo que drupal tiene la opción "Ver para impresión" o algo parecido.
Gracias por la idea.
Un saludo.
PD: elpreto, lo de las fotos mejor lo dejamos para el calendario de KDEHispano ;).
Y...
Un DVD de Mandriva, para que aprendan a usar un SO de verdad [/flame]
Buenisimo viejo, gracias por
Buenisimo viejo, gracias por tu trabajo.
Por ahora esto de ver a la familia solo en navidad y ocasiones asi, hace que no puedo empezar a probar los tutoriales, pero ya, en unos dias empiezo.