2015-01-08 4 views
0

enter image description hereУдаление заголовка из приложения Qt

Я сделал приложение, использующее Qt Creator. Поскольку я хотел, чтобы он отличался от обычных приложений Windows, я удалил строку заголовка Windows. Однако без заголовка я не мог перемещать, сворачивать и максимизировать приложение. Если возможно, я хочу, чтобы мое приложение было перемещено, удерживая панель меню и помещая эти три красочные круглые кнопки, которые используются в приложениях OS X в верхнем правом углу строки меню. Является ли это выполнимым в Qt?

+0

возможно дубликат [Объединить панель инструментов и строку заголовка в Qt] (http://stackoverflow.com/questions/16681965/combine-toolbar-and-title- bar-in-qt) – tux3

+0

Я не думаю, что это дубликат этого. Этот вопрос для Mac, и это для Windows из того, что я читал. –

+0

@ user3734823, вы говорите о «Windows», «Windows» или «Window's»? Надеюсь, я неправильно это отредактировал. Возможно, вы захотите добавить «в Windows» к названию, если это так. –

ответ

0

Я объясню, как получить его структуру, но я оставлю его вам, чтобы создать все и подключить сигналы.

Лучше всего было бы создать свой собственный класс QWidget, называемый чем-то вроде «TitleBar» и дать ему QHBoxLayout. В классе «TitleBar» создайте еще QWidget и QHBoxLayout, чтобы они содержали кнопки. Создайте 3 QPushButtons и добавьте их в него. Затем вам нужно создать свой собственный класс QMenuBar, который называется «MenuBar», чтобы вы могли получать события мыши и создавать механизм перетаскивания. Ниже приведен пример кода того, как вы можете это сделать.

TitleBar

TitleBar::TitleBar() : 
    QWidget() 
{ 

    QHBoxLayout *l = new QHBoxLayout(); 
    l->setContentsMargins(0, 0, 0, 0); 
    setLayout(l); 

    QWidget *buttonGroup = new QWidget(); 
    QHBoxLayout *buttonLayout = new QHBoxLayout(); 
    buttonLayout->setContentsMargins(0, 0, 0, 0); 

    QPushButton *minButton = new QPushButton(""); 
    QPushButton *maxButton = new QPushButton(""); 
    QPushButton *closeButton = new QPushButton(""); 

    buttonLayout->addWidget(minButton, Qt::AlignRight); 
    buttonLayout->addWidget(maxButton, Qt::AlignRight); 
    buttonLayout->addWidget(closeButton, Qt::AlignRight); 

    buttonGroup->setLayout(buttonLayout); 
    buttonGroup->setFixedSize(buttonGroup->sizeHint()); 

    MenuBar *bar = new MenuBar(); 
    bar->addMenu("&File"); 

    l->addWidget(bar); 
    l->addWidget(buttonGroup); 

} 

MenuBar

void MenuBar::mouseMoveEvent(QMouseEvent *event) 
{ 
    if(event->buttons() == Qt::LeftButton) 
    { 
     QPointF newPos = (event->localPos() - dragPos) + window()->pos(); 
     window()->move(newPos.x(), newPos.y()); 
    } 
    else 
     QMenuBar::mouseMoveEvent(event); 
} 

void MenuBar::mousePressEvent(QMouseEvent *event) 
{ 
    dragPos = event->localPos(); 
    QMenuBar::mousePressEvent(event); 
} 

Вы можете просто добавить класс «Titlebar» к вашему основному макету вашего виджета с верхним выравниванием и вы все хорошо! Теперь это не идеально, но я думаю, что он выполняет свою работу.

Вот пример проекта, который использует этот метод: http://www.filedropper.com/menubartest

+0

Я пробовал, как вы и предполагали, но продолжайте получать эту ошибку. Msg, синтаксическая ошибка: mssing; перед идентификатором QtCoreModule – user3734823

+0

О, кстати, я использовал метод продвижения для добавления настраиваемого виджета, и я включил пользовательский класс в текстовом поле в titlebar.h. Может ли быть причиной проблемы? – user3734823

+0

Я не уверен. Я отправил примерный пример, используя этот метод в ответе. Просто скопируйте классы меню и заголовков в свой проект. –

Смежные вопросы