2011-12-18 17 views
6

Macにファイルを保存すると、パネルが一番上のバーから下に降りてきて、本当にクールな方法で表示されます。 Qtフレームワークを使って同様のことをするクラスを作成したいと思います。私が混乱していることがいくつかあります:QMainWindowのMenubarの下部に「降下パネル」を添付する方法

  1. 親ウィンドウへの入力をブロックする必要があります。これはsetModal()メソッドを持っているので、QDialogでは簡単ですが、 - QDialogsはデフォルトで飛び出します。私はこれを回避する方法がわかりません。

  2. QMainProjectには、QMenua DescendingPanelクラスの新しいインスタンスが作成されます。メニューバーの下に他のウィジェットがあるとしたら、どうしたらいいでしょうか? DescendingPanelがその上に表示されます。

本当にありがとうございます。

EDITは、私の代わりに、メニューバーの下にダイアログをペッグの、ちょうどそれが下に表示させると、窓枠を削除する考えを持っていました。そうすれば、それがそこの下から飛び出したという錯覚を与えるでしょう。もちろん、移動イベントも処理しなければならないので、ダイアログは常にメニューバーの下にありますが、それは後で行います。ここでは、メニューバーの下にDescendingDialogを表示するために使用したコードを示します。

それは動作しませんでした
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(); 

    } 
}; 

GlobalLocationOfMenu.x()および.Yは()私はそれがしたい場所のダイアログが表示されないので、0を返したため。

+0

私はちょうど考えがありました。 QToolbarの下部にダイアログをペグするのではなく、QMainMindowが画面上を移動してもツールバーの下に常にパネルが表示されるように、相対的な方法で座標を設定しようとする可能性があります。私はそれを実装できるかどうかを見極めるつもりです。それがうまくいけば、残っているのはグラスフレーム(最大化ボタン、最小化ボタン、および閉じるボタンが含まれているもの)を取り除くことだけです。それらを削除すると、ダイアログは実際は別のウィンドウです。 –

+0

私は上記のことをやってみましたが、ツールバーのすぐ下にダイアログが表示されません。私はpos()を使ってツールバーの位置を取得し、ツールバーを基準にしてダイアログの位置を設定しましたが、ほとんどの場合、中心から離れたように見えました。 –

+0

mapToGlobalメソッドを使用しましたか? posは親の位置に関連して返ることを覚えておいてください。 –

答えて

2

あなたは、同様の機能を使って、「スライド」ダイアログを聞かせすることができます

#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(); 
} 

dialog引数があること、1つの子ウィジェットで(見え/いない隠された)QDialogインスタンスを指すものとしますダイアログに属する他のすべてのウィジェットが含まれています。

引数はdialogの位置とサイズ(親ウィジェットを基準にして)が現れた後に指定するものとします。

結果はlike thisとなります。

+0

+ 50!本当にありがとう!私は欲しかった効果を得て、私は本当にこれから構築することができます。本当にクリア。再度、感謝します :) –

関連する問題