Как прикрепить "нисходящую панель" к нижней части менюбара в QMainWindow

Когда вы сохраняете файл на Mac, панель как бы спускается вниз с верхней панели очень крутым способом. Я хочу создать класс, который делает аналогичную вещь, используя фреймворк Qt. Есть несколько вещей, которые меня смущают:

  1. Когда панель опускается, ввод в родительское окно должен быть заблокирован. Это легко сделать с QDialog, так как у него есть метод setModal(), однако - QDialogs, по умолчанию, всплывает. Я не уверен, как обойти это.

  2. В QMainProject, есть QMenua создается новый экземпляр класса DescendingPanel. Как это сделать, если предположить, что ниже менюбара есть другие виджеты. DescendingPanel должна появиться над ними.

Буду очень признателен за любую помощь в этом вопросе.

EDIT

У меня возникла идея вместо того, чтобы закрепить диалог под менабаром, просто сделать так, чтобы он появлялся под ним и убрать рамку окна. Таким образом, будет создаваться иллюзия, что он выскочил оттуда. Конечно, события Move также должны быть обработаны так, чтобы диалог всегда находился под менабаром, но это позже. Вот код, который я использовал, чтобы заставить 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, поэтому диалог не появляется там, где я хочу.

6
задан W.K.S 23 December 2011 в 08:15
поделиться