2011-12-18 8 views
6

Cuando guarda un archivo en una Mac, un panel desciende un poco desde la barra superior de una manera realmente genial. Quiero crear una clase que haga algo similar usando el marco Qt. Hay una serie de cosas que estoy confundido acerca de:Cómo colocar un 'panel descendente' en la parte inferior de la barra de menú en QMainWindow

  1. Cuando el panel desciende, entrada a la ventana padre debe ser bloqueado. Sin embargo, esto es fácil con QDialog, ya que tiene el método setModal() - QDialogs, por defecto pop-out. No estoy seguro de cómo solucionar esto.

  2. En QMainProject, se crea una nueva instancia QMenua de la clase DescendingPanel. ¿Cómo lo harías, suponiendo que haya otros widgets debajo de la barra de menú? The DescendingPanel debería aparecer encima de ellos.

Realmente agradecería cualquier ayuda con esto.

EDITAR

tenía una idea de que en lugar de vincular el cuadro de diálogo bajo la barra de menú, simplemente hacer que aparece debajo de allí y retire el marco de la ventana. De esa forma, daría la ilusión de que surgió desde allí. Por supuesto, los eventos Move también deberían manejarse de manera que el diálogo esté siempre debajo de la barra de menú, pero eso es para más tarde. Este es el código que utilicé para que aparezca el DescendingDialog debajo de la barra de menú.

class DescendingDialog : public QWidget 
{ 
    QMainWindow* Window; 
    QWidget*  Menu; 
    QPoint  GlobalLocationOfMenu; 
    int   DialogWidth; 
    int   DialogHeight; 

    int X() 
    { 
     int XDistanceOfPanel = GlobalLocationOfMenu.x() + ((Menu->width()/2) - (this->DialogWidth/2)); 
     //GlobalLocationOfMenu.x() returns 0; 
     return XDistanceOfPanel; 
    } 

    int Y() 
    { 
     int YDistanceOfPanel = GlobalLocationOfMenu.y()+Menu->height(); 
     //GlobalLocationOfMenu.y() returns 0; 
     return YDistanceOfPanel; 
    } 

    void SetGeometry() 
    { 
     this->setGeometry(this->X(),this->Y(),this->DialogWidth,this->DialogHeight); 

    } 
public: 
    DescendingDialog(QMainWindow* Window,int DialogWidth,int DialogHeight):QWidget(NULL) 
    { 
     this->Window = Window; 
     this->Menu = this->Window->menuWidget(); 
     this->DialogWidth = DialogWidth; 
     this->DialogHeight = DialogHeight; 

     QPoint RelativeLocationOfMenu = this->Menu->pos(); 
     this->GlobalLocationOfMenu = QWidget::mapToGlobal(RelativeLocationOfMenu); 
     this->SetGeometry(); 

    } 
}; 

No funcionó porque el GlobalLocationOfMenu.x() y .y() devuelve 0 por lo que no aparece el cuadro de diálogo donde yo quiero que haga.

+0

Solo tenía una idea. En lugar de vincular el diálogo a la parte inferior de la barra de herramientas de QTool, podría tratar de establecer sus coordenadas de una manera relativa para que el panel siempre aparezca debajo de la barra de herramientas, incluso si QMainMindow se mueve en la pantalla. Voy a ver si puedo implementar eso. Si funciona, todo lo que quedará será eliminar el Marco de Cristal (el que contiene los botones maximizar, minimizar y cerrar); eliminarlos disimularía el hecho de que el diálogo es, de hecho, una ventana separada. –

+0

He intentado hacer lo anterior, pero no puedo hacer que el cuadro de diálogo aparezca justo debajo de la barra de herramientas. Obtuve la ubicación de la barra de herramientas usando pos() y establecí la posición del cuadro de diálogo relativo a la barra de herramientas, pero en la mayoría de los casos parecía fuera del centro. –

+0

usaste los métodos mapToGlobal? recuerde que pos devolverá en relación con la posición padre –

Respuesta

2

Puede permitir que un "slide en" diálogo mediante una función similar a la que:

#include <QDialog> 
#include <QPropertyAnimation> 
#include <QParallelAnimationGroup> 

void makeAppear(QDialog * dialog, QRect geometryEnd) 
{ 
    static QParallelAnimationGroup *animationGroup = 0; 
    if (animationGroup) 
    { 
     for(int i = 0, ie = animationGroup->animationCount(); i != ie; ++i) 
      delete animationGroup->animationAt(i); 
     delete animationGroup; 
    } 

    // Set up start and end geometry for 'dialog'. 
    QPoint parentTopLeft = dialog->parentWidget()->geometry().topLeft(); 
    geometryEnd.translate(dialog->parentWidget()->mapToGlobal(parentTopLeft)); 
    QRect geometryBegin = geometryEnd; 
    geometryBegin.setHeight(0); 

    // Set up start and end geometry for the only child widget of 'dialog'. 
    QWidget * dialogChildWidget = dynamic_cast< QWidget * >(dialog->children().first()); 
    if (!dialogChildWidget) 
     return; 
    QRect childGeometryEnd = dialogChildWidget->geometry(); 
    QRect childGeometryBegin = childGeometryEnd; 
    childGeometryBegin.translate(0, geometryEnd.height() * (-1)); 

    // Set up animation for 'dialog'. 
    QPropertyAnimation *dialogAnimation = new QPropertyAnimation(dialog, "geometry"); 
    dialogAnimation->setDuration(400); 
    dialogAnimation->setStartValue(geometryBegin); 
    dialogAnimation->setEndValue(geometryEnd); 

    // Set up animation for the only child widget of 'dialog'. 
    QPropertyAnimation *childAnimation = new QPropertyAnimation(dialogChildWidget, "geometry"); 
    childAnimation->setDuration(400); 
    childAnimation->setStartValue(childGeometryBegin); 
    childAnimation->setEndValue(childGeometryEnd); 

    // Set up (and start) a parallel animation group 
    animationGroup = new QParallelAnimationGroup; 
    animationGroup->addAnimation(dialogAnimation); 
    animationGroup->addAnimation(childAnimation); 
    animationGroup->start(); 

    // Make 'dialog' visible, borderless, modal. 
    dialog->setModal(true); 
    dialog->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); 
    dialog->show(); 
} 

El argumento dialog deberán apuntar a un (oculto/no visible) instancia QDialog con un widget solo hijo, que contiene todos los otros widgets que pertenecen al diálogo.

El argumento geometryEnd especificará la posición y el tamaño de dialog después de que haya aparecido (en relación con su widget principal).

El resultado es like this.

+0

+ 50! ¡Muchas gracias! Obtuve el efecto que quería y puedo trabajar realmente a partir de esto. Muy claro. Gracias de nuevo :) –

Cuestiones relacionadas