2010-02-10 20 views
13

Jestem nowy w Qt C++. Ściągnąłem najnowszą wersję systemu Windows, zrobiłem kilka tutoriali i było świetnie.Tworzenie okna bez ramki z Qt

Widziałem niektóre opcje stylizacji, które mają ramy Qt i ich świetne, ale teraz muszę zbudować moją aplikację, że jej główne okna (formularz) zostały zaprojektowane/skórki z obrazem bez granic prostokąta (bez ramki?).

Jak mogę to zrobić z Qt?

Odpowiedz

13

Jeśli szukasz jakiejś zaawansowanej stylizacji w kształcie widget, może ten przykład pomoże:

Shaped Clock Example

A może jesteś po prostu patrząc na tego rodzaju flagi: Qt::CustomizeWindowHint lub po prostu Qt::FramelessWindowHint.

+0

Shaped zegara przykładzie jest to, czy istnieją jakieś inne przykłady podobnych? – user63898

+0

Nie do mojej wiedzy ... Niestety ... –

+0

Oto kod: Qt :: Flagi WindowFlags = this-> windowFlags(); this-> setWindowFlags (flags | Qt :: FramelessWindowHint); – GeneCode

2

Wpadłem na to sam i zorientowałem się po pewnym czasie. Sprawdź kod https://github.com/ianbannerman/TrueFramelessWindow dla przykładowego systemu operacyjnego Windows OS X OS X &.

Qt :: FramelessWindowHint poświęca zmiany rozmiaru i min/max/close, więc prawdopodobnie nie jest to, czego szukają ludzie.

2

stworzyłem mały przykład, jak stworzyć VS2013 jak bezramowe okna w Qt5: screenshot (mac) qt frameless window with dark style

można uzyskać kompletne źródła tutaj: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle

Inaczej tu przegląd kod jak osadzić " główne okno "mainwindow into the" bezramkowe ". Możesz także zobaczyć, jak dodać pasek tytułowy, przyciski i jak maksymalizować, zmieniać rozmiar i przesuwać okno bez ramek.

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QtWidgets> 

/* 
place your QMainWindow code here 
*/ 
namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
private: 
    Ui::MainWindow *ui; 
}; 

/* 
this class is to add frameless window supoort and do all the stuff with titlebar and buttons 
*/ 
class BorderlessMainWindow: public QMainWindow 
{ 
    Q_OBJECT 
public: 
    explicit BorderlessMainWindow(QWidget *parent = 0); 
    ~BorderlessMainWindow() {} 
protected: 
    void mouseMoveEvent(QMouseEvent* event); 
    void mousePressEvent(QMouseEvent* event); 
    void mouseReleaseEvent(QMouseEvent* event); 
    void mouseDoubleClickEvent(QMouseEvent *event); 
private slots: 
    void slot_minimized(); 
    void slot_restored(); 
    void slot_maximized(); 
    void slot_closed(); 
private: 
    MainWindow *mMainWindow; 
    QWidget *mTitlebarWidget; 
    QLabel *mWindowTitle; 
    QPushButton *mMinimizeButton; 
    QPushButton *mRestoreButton; 
    QPushButton *mMaximizeButton; 
    QPushButton *mCloseButton; 
    QPoint mLastMousePosition; 
    bool mMoving; 
    bool mMaximized; 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QDebug> 

/* 
frameless window class: it adds the MainWindow class inside the centralWidget 
*/ 
BorderlessMainWindow::BorderlessMainWindow(QWidget *parent) : QMainWindow(parent, Qt::CustomizeWindowHint) { 
    setObjectName("borderlessMainWindow"); 
    setWindowFlags(Qt::FramelessWindowHint| Qt::WindowSystemMenuHint); 

    mMainWindow = new MainWindow(this); 
    setWindowTitle(mMainWindow->windowTitle()); 

    QVBoxLayout *verticalLayout = new QVBoxLayout(); 
    verticalLayout->setSpacing(0); 
    verticalLayout->setMargin(1); 

    QHBoxLayout *horizontalLayout = new QHBoxLayout(); 
    horizontalLayout->setSpacing(0); 
    horizontalLayout->setMargin(0); 

    mTitlebarWidget = new QWidget(this); 
    mTitlebarWidget->setObjectName("titlebarWidget"); 
    mTitlebarWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); 
    mTitlebarWidget->setLayout(horizontalLayout); 

    mMinimizeButton = new QPushButton(mTitlebarWidget); 
    mMinimizeButton->setObjectName("minimizeButton"); 
    connect(mMinimizeButton, SIGNAL(clicked()), this, SLOT(slot_minimized())); 

    mRestoreButton = new QPushButton(mTitlebarWidget); 
    mRestoreButton->setObjectName("restoreButton"); 
    mRestoreButton->setVisible(false); 
    connect(mRestoreButton, SIGNAL(clicked()), this, SLOT(slot_restored())); 

    mMaximizeButton = new QPushButton(mTitlebarWidget); 
    mMaximizeButton->setObjectName("maximizeButton"); 
    connect(mMaximizeButton, SIGNAL(clicked()), this, SLOT(slot_maximized())); 

    mCloseButton = new QPushButton(mTitlebarWidget); 
    mCloseButton->setObjectName("closeButton"); 
    connect(mCloseButton, SIGNAL(clicked()), this, SLOT(slot_closed())); 

    mWindowTitle = new QLabel(mTitlebarWidget); 
    mWindowTitle->setObjectName("windowTitle"); 
    mWindowTitle->setText(windowTitle()); 

    horizontalLayout->addWidget(mWindowTitle); 
    horizontalLayout->addStretch(1); 
    horizontalLayout->addWidget(mMinimizeButton); 
    horizontalLayout->addWidget(mRestoreButton); 
    horizontalLayout->addWidget(mMaximizeButton); 
    horizontalLayout->addWidget(mCloseButton); 

    verticalLayout->addWidget(mTitlebarWidget); 
    verticalLayout->addWidget(mMainWindow); 

    QWidget *centralWidget = new QWidget(this); 
    centralWidget->setObjectName("centralWidget"); 
    centralWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
    centralWidget->setLayout(verticalLayout); 

    setCentralWidget(centralWidget); 
} 
void BorderlessMainWindow::mousePressEvent(QMouseEvent* event) { 
    if (!mTitlebarWidget->underMouse() && !mWindowTitle->underMouse()) 
    return; 

    if(event->button() == Qt::LeftButton) { 
    mMoving = true; 
    mLastMousePosition = event->pos(); 
    } 
} 
void BorderlessMainWindow::mouseMoveEvent(QMouseEvent* event) { 
    if (!mTitlebarWidget->underMouse() && !mWindowTitle->underMouse()) 
    return; 

    if(event->buttons().testFlag(Qt::LeftButton) && mMoving) { 
    this->move(this->pos() + (event->pos() - mLastMousePosition)); 
    } 
} 
void BorderlessMainWindow::mouseReleaseEvent(QMouseEvent* event) { 
    if (!mTitlebarWidget->underMouse() && !mWindowTitle->underMouse()) 
    return; 

    if(event->button() == Qt::LeftButton) { 
    mMoving = false; 
    } 
} 
void BorderlessMainWindow::mouseDoubleClickEvent(QMouseEvent *event) { 
    Q_UNUSED(event); 
    if (!mTitlebarWidget->underMouse() && !mWindowTitle->underMouse()) 
    return; 

    mMaximized = !mMaximized; 
    if (mMaximized) { 
    slot_maximized(); 
    } else { 
    slot_restored(); 
    } 
} 
void BorderlessMainWindow::slot_minimized() { 
    setWindowState(Qt::WindowMinimized); 
} 
void BorderlessMainWindow::slot_restored() { 
    mRestoreButton->setVisible(false); 
    mMaximizeButton->setVisible(true); 
    setWindowState(Qt::WindowNoState); 
    setStyleSheet("#borderlessMainWindow{border:1px solid palette(highlight);}"); 
} 
void BorderlessMainWindow::slot_maximized() { 
    mRestoreButton->setVisible(true); 
    mMaximizeButton->setVisible(false); 
    setWindowState(Qt::WindowMaximized); 
    setStyleSheet("#borderlessMainWindow{border:1px solid palette(base);}"); 
} 
void BorderlessMainWindow::slot_closed() { 
    close(); 
} 

/* 
MainWindow class: put all your code here 
*/ 
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent, Qt::FramelessWindowHint), ui(new Ui::MainWindow) { 
    ui->setupUi(this); 
    statusBar()->setSizeGripEnabled(true); 
} 

MainWindow::~MainWindow() { 
    delete ui; 
} 
+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. Przeczytaj ten [jak-odpowiedź] (http://stackoverflow.com/help/how-to-answer) w celu uzyskania wysokiej jakości odpowiedzi. – thewaywewere