2010-02-10 8 views
13

Sono nuovo di Qt C++. Ho scaricato l'ultima versione di Windows, ho fatto alcuni tutorial ed è fantastico.Creazione di una finestra senza bordi con Qt

Ho visto alcune opzioni di stile che il framework Qt ha ed è ottimo, ma ora ho bisogno di compilare la mia applicazione che la sua finestra principale (form) ha progettato/scorticato con l'immagine senza i bordi del rettangolo (senza bordi?).

Come posso farlo con Qt?

risposta

13

Se cercate un po 'di styling avanzata nella forma di un widget, forse questo esempio vi aiuterà a:

Shaped Clock Example

O forse stai semplicemente alla ricerca di questo tipo di bandiera: Qt::CustomizeWindowHint o semplicemente Qt::FramelessWindowHint.

+0

a forma di orologio Esempio è questo, c'è qualche altri esempi come questo? – user63898

+0

Non a mia conoscenza ... Sfortunatamente ... –

+0

Ecco il codice: Qt :: WindowFlags flags = this-> windowFlags(); this-> setWindowFlags (flags | Qt :: FramelessWindowHint); – GeneCode

2

Mi sono imbattuto in questo me stesso e capito dopo un po 'di tempo. Controlla https://github.com/ianbannerman/TrueFramelessWindow per codice di esempio per entrambi i MacOS di Windows &.

Qt :: FramelessWindowHint sacrifica il ridimensionamento e min/max/chiudi, quindi probabilmente non è ciò che la gente mot cerca.

2

ho creato un piccolo esempio, di come creare VS2013 come finestra frameless in QT5: screenshot (mac) qt frameless window with dark style

È possibile ottenere i sorgenti completi qui: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle

Altrimenti qui una panoramica di codice di come incorporare il " main "mainwindow nella finestra" frameless ". Inoltre puoi vedere come aggiungere la barra del titolo, i pulsanti e ingrandire, ridimensionare e spostare la finestra frameless.

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

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. Leggere questo [come risposta] (http://stackoverflow.com/help/how-to-answer) per fornire una risposta di qualità. – thewaywewere