Ver Mensaje Individual
  #12 (permalink)  
Antiguo 18/02/2015, 13:50
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Qt. Duda sobre promoted widgets

Cita:
Iniciado por eferion Ver Mensaje
Para la botonera del editor la puedes simular con varios botones puestos en fila con un QHBoxLayout y, justo debajo, el editor.

Si tu idea es ocultar la botonera a placer, puedes meter los botones dentro de un QWidget y así puedes controlar la visibilidad de todos los botones únicamente cambiando la visibilidad del QWidget.
Hola eferion:
Uno de mis planteamientos era ese e hice algo en ese sentido. Pero temas estéticos aparte, la idea era reciclar un QmainWindow y aprovechar sus acciones y barra de tareas.

Finalmente, ya he leído que le podemos cambiar el flag a un QMainWindow para que pase de Qt::Window a Qt::Widget, y poder usarlo normalmente como tal.

Ahora la duda es que no sé hacerlo de modo gráfico. Miraré a ver, porque la idea es usar en la medida de lo posible los formularios. Creo que es mejor y mas mantenible.

Por si a alguien le vale, pongo el ejemplo:

El editor, que es un QMainWindow (sacado del libro The Book of Qt 4_ The Art of Building Qt Applications):

editor.h
Código C++:
Ver original
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QFileDialog>
  5. #include <QMessageBox>
  6. #include "ui_mainwindow.h"
  7. #include <QStatusBar>
  8. #include <QLabel>
  9.  
  10. class QLabel;
  11.  
  12. class MainWindow :  public QMainWindow,
  13.             private Ui::MainWindow
  14. {
  15.     Q_OBJECT
  16.     public:
  17.     MainWindow (QWidget* parent=0);
  18.     //~MainWindow();
  19.  
  20.     protected:
  21.     void setupActions();
  22.     void mayDiscardDocument();
  23.     void saveFile(const QString&);
  24.  
  25.     protected slots:
  26.     void newFile();
  27.     void loadFile();
  28.     void saveFile();
  29.     void saveFileAs();
  30.     void undo();
  31.     void redo();
  32.     void copy();
  33.     void cut();
  34.     void paste();
  35.     void about();
  36.     void updateStats();
  37.    
  38.     private:
  39.     QString mFilePath;
  40.     QLabel *mStatLabel;
  41. };
  42.  
  43. #endif

editor.cpp
Código C++:
Ver original
  1. #include <QtGui>
  2. #include "mainwindow.h"
  3.  
  4. MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
  5. {
  6.     setupUi(this); 
  7.     setupActions();
  8.     mFilePath="";
  9.     mStatLabel = new QLabel;
  10.     estatusBar->addPermanentWidget(mStatLabel);
  11.     connect (textEdit, SIGNAL(textChanged()), this, SLOT(updateStats()));
  12.     updateStats(); 
  13. }
  14.  
  15. void MainWindow::setupActions()
  16. {
  17.     connect(action_Quit, SIGNAL(triggered(bool)),qApp, SLOT(quit()));
  18.     connect(action_Open, SIGNAL(triggered(bool)),this, SLOT(loadFile()));
  19.     connect(action_Save, SIGNAL(triggered(bool)),this, SLOT(saveFile()));
  20.     connect(action_Save_as, SIGNAL(triggered(bool)),this, SLOT(saveFileAs()));
  21.     connect(action_New, SIGNAL(triggered(bool)),this,SLOT(newFile()));
  22.  
  23.     connect(textEdit, SIGNAL(copyAvailable(bool)),action_Copiar, SLOT(setEnabled(bool)));
  24.     connect(textEdit, SIGNAL(undoAvailable(bool)),action_Undo, SLOT(setEnabled(bool)));
  25.     connect(textEdit, SIGNAL(redoAvailable(bool)),actionRedo, SLOT(setEnabled(bool)));
  26.  
  27.     connect(action_Copiar, SIGNAL(triggered(bool)),this, SLOT(copy()));
  28.     connect(actionCut, SIGNAL(triggered(bool)),this, SLOT(cut()));
  29.     connect(actionPaste, SIGNAL(triggered(bool)),this, SLOT(paste()));
  30.    
  31.     connect(action_Undo, SIGNAL(triggered(bool)),this, SLOT(undo()));
  32.     connect(actionRedo, SIGNAL(triggered(bool)),this, SLOT(redo()));
  33.     connect(actionInfo, SIGNAL(triggered(bool)),this, SLOT(about()));
  34. }
  35.  
  36. void MainWindow::loadFile()
  37. {
  38.     mayDiscardDocument();
  39.    
  40.         QString filename = QFileDialog::getOpenFileName(
  41.                             this,
  42.                             "Selecciona un fichero para abrir",
  43.                             "",
  44.                             "Texto (*.txt *.h *.cpp)");
  45.         QFile file(filename);
  46.     if (file.open(QIODevice::ReadOnly|QIODevice::Text))
  47.     {
  48.         textEdit->setPlainText(QString::fromUtf8(file.readAll()));
  49.         mFilePath = filename;
  50.         estatusBar->showMessage(tr("File successfully loaded."), 3000);
  51.     }
  52.  
  53. }
  54.  
  55. void MainWindow::saveFile()
  56. {
  57.     if (mFilePath.isEmpty())
  58.     {
  59.         saveFileAs();
  60.     }
  61.     else
  62.     {
  63.         saveFile(mFilePath);
  64.     }
  65. }
  66.  
  67. void MainWindow::saveFile(const QString& name)
  68. {
  69.     QFile file(name);
  70.     if (file.open(QIODevice::WriteOnly|QIODevice::Text))
  71.     {
  72.         file.write(textEdit->toPlainText().toUtf8());
  73.         estatusBar->showMessage(tr("File save succesfully."),3000);
  74.         textEdit->document()->setModified(false);
  75.     }
  76. }
  77.  
  78. void MainWindow::saveFileAs()
  79. {
  80.     mFilePath = QFileDialog::getSaveFileName(this);
  81.     if(mFilePath.isEmpty())
  82.     {
  83.         return;
  84.     }
  85.     saveFile(mFilePath);
  86. }
  87.  
  88. void MainWindow::mayDiscardDocument()
  89. {
  90.     if (textEdit->document()->isModified())
  91.     {
  92.         QString filename = mFilePath;
  93.         if (filename.isEmpty()) filename = tr("Unnamed");
  94.         if (QMessageBox::question(this, tr("Save Document?"),tr("You want to create a new document, but the "
  95.             "changes in the current document %1 have not "
  96.             "been saved. How do you want to proceed?").arg(filename),
  97.             tr("Discard Changes"), tr("Save Document") ))
  98.         {
  99.             saveFile();
  100.         }
  101.     }
  102. }
  103.  
  104. void MainWindow::newFile()
  105. {
  106.     mayDiscardDocument();
  107.     textEdit->setPlainText("");
  108.     mFilePath = "";
  109. }
  110.  
  111. void MainWindow::undo()
  112. {
  113.     textEdit->document()->undo();
  114. }
  115.  
  116. void MainWindow::redo()
  117. {
  118.     textEdit->document()->redo();
  119. }
  120.  
  121. void MainWindow::copy()
  122. {
  123.     textEdit->copy();
  124. }
  125.  
  126. void MainWindow::cut()
  127. {
  128.     textEdit->cut();
  129. }
  130.  
  131. void MainWindow::paste()
  132. {
  133. textEdit->paste();
  134. }
  135.  
  136.  
  137. void MainWindow::about()
  138. {
  139.     QMessageBox::about(this, tr("About CuteEdit"),
  140.         tr("CuteEdit 1.0\nA Qt application example.\n"
  141.         "(c) 2006 Daniel Molkentin, Open Source Press"));
  142. }
  143.  
  144. void MainWindow::updateStats()
  145. {
  146.     QString text = textEdit->document()->toPlainText();
  147.     int chars = text.length();
  148.     text = text.simplified();
  149.     int words = 0;
  150.     words = text.count(" ");
  151.     if (!text.isEmpty())
  152.     {
  153.         words++;
  154.     }
  155.     QString output = tr("Characters : %1, Words: %2").arg(chars).arg(words);
  156.     mStatLabel->setText(output);
  157. }

Un Widget compuesto por dos QTableView y el editor:
miwidget.h
Código C++:
Ver original
  1. #ifndef MIWIDGET_H
  2. #define MIWIDGET_H
  3.  
  4. #include <QVBoxLayout>
  5. #include <QLabel>
  6. #include <QTableView>
  7. #include "./Editor/mainwindow.h"
  8.  
  9. class MiWidget : public QWidget
  10. {
  11.     Q_OBJECT
  12. public:
  13.     explicit MiWidget(QWidget *parent = 0);
  14.  
  15. signals:
  16.  
  17. public slots:
  18.  
  19. private:
  20.     QVBoxLayout* lienzo;
  21.     MainWindow* editor;
  22.     QTableView* tabla1;
  23.     QTableView* tabla2;
  24.  
  25. };
  26.  
  27. #endif // MIWIDGET_H

miwidget.cpp
Código C++:
Ver original
  1. #include "miwidget.h"
  2.  
  3. MiWidget::MiWidget(QWidget *parent) :
  4.     QWidget(parent)
  5. {
  6.     lienzo = new QVBoxLayout;
  7.     editor= new MainWindow;
  8.     tabla1= new QTableView;
  9.     tabla2= new QTableView;
  10.     editor->setWindowFlags(editor->windowFlags() & ~Qt::Window); //opcionalmente editor->setWindowFlags(Qt::Widget) ?
  11.     lienzo->addWidget(tabla1);
  12.     lienzo->addWidget(tabla2);
  13.     lienzo->addWidget(editor);
  14.     this->setLayout(lienzo);
  15. }

El MainWindow "padre":

Código C++:
Ver original
  1. #ifndef MAINMAINWINDOW_H
  2. #define MAINMAINWINDOW_H
  3.  
  4. #include "ui_mainmainwindow.h"
  5. #include "miwidget.h"
  6.  
  7. class MainMainWindow : public QMainWindow, private Ui::MainMainWindow
  8. {
  9.     Q_OBJECT
  10.  
  11. public:
  12.     explicit MainMainWindow(QWidget *parent = 0);
  13.  
  14. private:
  15.     MiWidget* central;
  16. };
  17.  
  18. #endif // MAINMAINWINDOW_H

Código C++:
Ver original
  1. #include "mainmainwindow.h"
  2.  
  3. MainMainWindow::MainMainWindow(QWidget *parent) :
  4.     QMainWindow(parent)
  5. {
  6.     setupUi(this);
  7.     central = new MiWidget(this);
  8.  
  9.     this->setCentralWidget(central);
  10.  
  11.  
  12. }

Y el resultado:
__________________
Mi calculadora en Qt

Última edición por dehm; 18/02/2015 a las 13:56