Antes de nada, gracias por responder.
Sí, quiero diseñar la ventana gráficamente en la medida de lo posible, y estoy usando QtCreator (Versión 1.2.1)
Hasta ahora, para la prueba, tengo mi ventana principal diseñada en mainwindow.ui. Después tengo los ficheros mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
namespace Ui
{
class MainWindow;
class Dialog;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
private slots:
void on_action_Usando_el_asistente_triggered();
void on_pushButton_3_clicked();
void on_pushButton_2_clicked();
void on_action_Iniciar_asistente_triggered();
void on_actionAcerca_de_Hyde_triggered();
void on_actionT_cnicas_de_estegoan_lisis_triggered();
void on_actionExtrayendo_mensajes_triggered();
void on_actionOcultando_mensajes_triggered();
void on_action_ndice_triggered();
void on_actionOcultar_bits_aleatorios_triggered();
void on_actionAn_lisis_RS_triggered();
void on_actionAn_lisis_de_Histograma_triggered();
void on_actionAtaque_Chi_Cuadrado_triggered();
void on_actionAtaque_Visual_triggered();
void on_actionJSteg_2_triggered();
void on_actionSSB_5_triggered();
void on_actionEZ_Stego_2_triggered();
void on_actionDistance_Sort_2_triggered();
void on_actionLuminance_Sort_2_triggered();
void on_actionLSB_Adaptativo_2_triggered();
void on_actionLSB_Fuerte_2_triggered();
void on_actionLSB_Simple_2_triggered();
void on_actionJSteg_triggered();
void on_actionSSB_4_triggered();
void on_actionEZ_Stego_triggered();
void on_actionDistance_Sort_triggered();
void on_actionLuminance_Sort_triggered();
void on_actionLSB_Fuerte_triggered();
void on_actionLSB_Adaptativo_triggered();
void on_actionLSB_Simple_triggered();
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
Que me he supuesto que contendría la definicion de mi ventana principal, y mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "lsb_simple_params.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
ui->textBrowser->clear();
}
void MainWindow::on_actionLSB_Simple_triggered()
{
ui->textBrowser->append("Has seleccionado esconder un mensaje usando LSB Simple");
}
void MainWindow::on_actionLSB_Adaptativo_triggered()
{
ui->textBrowser->append("Has seleccionado esconder un mensaje usando LSB Adaptativo");
}
void MainWindow::on_actionLSB_Fuerte_triggered()
{
ui->textBrowser->append("Has seleccionado esconder un mensaje usando LSB Fuerte");
}
void MainWindow::on_actionLuminance_Sort_triggered()
{
ui->textBrowser->append("Has seleccionado esconder un mensaje usando Luminance Sort");
}
void MainWindow::on_actionDistance_Sort_triggered()
{
ui->textBrowser->append("Has seleccionado esconder un mensaje usando Distance Sort");
}
void MainWindow::on_actionEZ_Stego_triggered()
{
ui->textBrowser->append("Has seleccionado esconder un mensaje usando Ez-Stego");
}
void MainWindow::on_actionSSB_4_triggered()
{
ui->textBrowser->append("Has seleccionado esconder un mensaje usando SSB-4");
}
void MainWindow::on_actionJSteg_triggered()
{
ui->textBrowser->append("Has seleccionado esconder un mensaje usando JSteg");
}
void MainWindow::on_actionLSB_Simple_2_triggered()
{
ui->textBrowser->append("Has seleccionado extraer un mensaje usando LSB Simple");
}
void MainWindow::on_actionLSB_Fuerte_2_triggered()
{
ui->textBrowser->append("Has seleccionado extraer un mensaje usando LSB Fuerte");
}
void MainWindow::on_actionLSB_Adaptativo_2_triggered()
{
ui->textBrowser->append("Has seleccionado extraer un mensaje usando LSB Adaptativo");
}
void MainWindow::on_actionLuminance_Sort_2_triggered()
{
ui->textBrowser->append("Has seleccionado extraer un mensaje usando Luminance Sort");
}
void MainWindow::on_actionDistance_Sort_2_triggered()
{
ui->textBrowser->append("Has seleccionado extraer un mensaje usando Distance Sort");
}
void MainWindow::on_actionEZ_Stego_2_triggered()
{
ui->textBrowser->append("Has seleccionado extraer un mensaje usando EZ-Stego");
}
void MainWindow::on_actionSSB_5_triggered()
{
ui->textBrowser->append("Has seleccionado extraer un mensaje usando SSB-4");
}
void MainWindow::on_actionJSteg_2_triggered()
{
ui->textBrowser->append("Has seleccionado extraer un mensaje usando JSteg");
}
void MainWindow::on_actionAtaque_Visual_triggered()
{
ui->textBrowser->append("Has seleccionado realizar un ataque visual a la imagen");
}
void MainWindow::on_actionAtaque_Chi_Cuadrado_triggered()
{
ui->textBrowser->append("Has seleccionado realizar un ataque Chi-Cuadrado a la imagen");
}
void MainWindow::on_actionAn_lisis_de_Histograma_triggered()
{
ui->textBrowser->append("Has seleccionado realizar un análisis de histograma a la imagen");
}
void MainWindow::on_actionAn_lisis_RS_triggered()
{
ui->textBrowser->append("Has seleccionado realizar un análisis RS a la imagen");
}
void MainWindow::on_actionOcultar_bits_aleatorios_triggered()
{
ui->textBrowser->append("Has seleccionado rellenar los LSB de la imagen con bits aleatorios");
}
void MainWindow::on_action_ndice_triggered()
{
ui->textBrowser->append("Has seleccionado el índice de la ayuda");
}
void MainWindow::on_actionOcultando_mensajes_triggered()
{
ui->textBrowser->append("Has seleccionado capítulo \"Ocultar mensajes\" de la ayuda");
}
void MainWindow::on_actionExtrayendo_mensajes_triggered()
{
ui->textBrowser->append("Has seleccionado capítulo \"Extraer mensajes\" de la ayuda");
}
void MainWindow::on_actionT_cnicas_de_estegoan_lisis_triggered()
{
ui->textBrowser->append("Has seleccionado capítulo \"Técnicas de estegoanálisis\" de la ayuda");
}
void MainWindow::on_actionAcerca_de_Hyde_triggered()
{
ui->textBrowser->append("Hyde. Un programa de esteganografía y estegoanálsis en imágenes digitales");
QMessageBox msgBox;
msgBox.setWindowTitle("Acerca de Hyde");
msgBox.setText("Hyde. Un programa de esteganografía y estegoanálsis en imágenes digitales");
msgBox.exec();
}
void MainWindow::on_action_Iniciar_asistente_triggered()
{
ui->textBrowser->append("Has seleccionado el asistente");
}
void MainWindow::on_pushButton_2_clicked()
{
ui->textBrowser->append("Has seleccionado limpiar la imagen");
}
void MainWindow::on_pushButton_3_clicked()
{
ui->textBrowser->append("Has seleccionado cargar una imagen");
}
void MainWindow::on_action_Usando_el_asistente_triggered()
{
ui->textBrowser->append("Has seleccionado capítulo \"Usando el asistente\" de la ayuda");
}
Que contiene lo que hago en los para cada señal (por ahora lo único que he hecho es que me muestre un mensaje un un textBrowser que tengo a modo de consola).
Por último tengo un main.cpp:
#include <QtGui/QApplication>
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Que lo único que hace es crear la ventana principal, mostrarla y esperar algún evento.
Ahora quería hacer un QDialog (por ejemplo) de manera que cuando pulse en una opción de mi ventana principal, se muestre el diálogo (que es donde voy a recoger algunos parámetros para un algoritmo), y quiero colocar un botón aceptar en dicho diálogo, para que cuanto lo pulse se cierre esa ventana, se ejecute el algoritmo, y vuelva a la pantalla principal (mainwindow.ui).
Así que le he dado a archivo/nuevo/clase del formulario de Qt Designer/Dialog without buttons con los nombres de diálogo y clase por defecto (clase Dialog, encabezado dialog.h, fuentes dialog.cpp formulario dialog.ui y ruta la de mi proyecto), dejo marcada la opción de agregar al proyecto y empiezo a diseñar mi ventana con el Qt Designer. Al acabar compilo y sin problemas.
Ahora, mis archivos dialog.h y dialog.cpp están así:
#ifndef DIALOG_H
#define DIALOG_H
#include <QtGui/QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog {
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
protected:
void changeEvent(QEvent *e);
private:
Ui::Dialog *m_ui;
};
#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
m_ui(new Ui::Dialog)
{
m_ui->setupUi(this);
}
Dialog::~Dialog()
{
delete m_ui;
}
void Dialog::changeEvent(QEvent *e)
{
QDialog::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
m_ui->retranslateUi(this);
break;
default:
break;
}
}
Y aquí es cuando me pierdo: Se supone que esos archivos son equivalentes al "ajustes.h" que me has comentado? porque el dialog.h sólo incluye <QtGui/QDialog>, pero dialog.cpp sí que incluye ui_dialog.h.
He puesto en uno de los eventos de mi mainwindow.cpp:
void MainWindow::on_actionLSB_Simple_triggered()
{
ui->textBrowser->append("Has seleccionado esconder un mensaje usando LSB Simple");
Dialog* ajustes1;
ajustes1 = new Dialog(this);
ajustes1->show();
}
Y parece que funciona sin problemas (he cambiado el método showDialog por show a secas, que supongo que será lo mismo pero el showDialog no lo encontraba. Pero quiero saber si lo he hecho bien o me he dejado algo.
EDITO:
Pues algo me he tenido que dejar o hacer mal, porque si quiero editar algún slot (como uso Qt Designer marco con el ratón el widget que quiero y con click derecho selecciono la opción "Go to slot...") me da un mensaje de error "La definición de la clase Ui::Dialog no pudo ser encontrada en ......./dialog.cpp", con lo cual no puedo crear slots. He intentado crear otro Dialog limpio (sin tocar nada) y me da el mismo error así que supongo que tengo que añadir algo a dialog.cpp, pero ya tiene un #include "ui_dialog.h" Alguna idea?
EDITO 2:
Pues misteriosamente al cerrar y volver a abrir QtCreator me funcionan perfectamente los slots

. Ahora lo que estoy intentando hacer es que al cerrar el Dialog me muestre un mensaje en la ventana principal, pero de momento esto:
void MainWindow::on_actionLSB_Simple_triggered()
{
ui->textBrowser->append("Has seleccionado esconder un mensaje usando LSB Simple");
Dialog* ajustes1;
ajustes1 = new Dialog(this);
ajustes1->show();
ui->textBrowser->append("Has ejecutado el algoritmo LSB Simple");
}
No me funciona como quiero, porque muestra la ventana e inmediatamente muestra el mensaje, cuando lo que yo quiero es que no muestre el mensaje hasta que yo pulse en el botón "aceptar" del Dialog. Supongo que tendré que mirar como hacer que mi ventana principal responda a un evento de la otra ventana.