2010-02-10 12 views
13

Soy nuevo en Qt C++. Descargué la última versión de Windows, hice algunos tutoriales y es genial.Hacer una ventana sin bordes con Qt

Vi algunas opciones de estilo que tiene el marco de Qt y es genial, pero ahora tengo que construir mi aplicación que sus ventanas principales (forma) diseñó/pelada con la imagen sin los bordes del rectángulo (sin bordes?).

¿Cómo puedo hacerlo con Qt?

Respuesta

13

Si lo que buscas es un poco de estilo avanzado en la forma de un widget, puede que este ejemplo le ayudará a:

Shaped Clock Example

O tal vez simplemente está buscando este tipo de indicador: Qt::CustomizeWindowHint o simplemente Qt::FramelessWindowHint.

+0

Shaped Reloj Ejemplo esto es, es Hay ejemplos más como éste? – user63898

+0

No lo que yo sé ... Lamentablemente ... –

+0

Aquí está el código: Qt :: WindowFlags flags = this-> windowFlags(); this-> setWindowFlags (flags | Qt :: FramelessWindowHint); – GeneCode

2

Me encontré con esto y lo descubrí después de un tiempo. Consulte https://github.com/ianbannerman/TrueFramelessWindow para ver el código de muestra para Windows & macOS.

Qt :: FramelessWindowHint sacrifica el cambio de tamaño y min/max/close, por lo que probablemente no es lo que mot la gente está buscando.

2

he creado un pequeño ejemplo, de cómo crear VS2013 como ventana sin marco en QT5: screenshot (mac) qt frameless window with dark style

Puede obtener el código fuente completo aquí: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle

De lo contrario aquí una descripción de código de cómo integrar el " principal "ventana principal en la ventana" sin marco ". También puede ver cómo agregar la barra de título, los botones y maximizar, cambiar el tamaño y mover de la ventana sin marco.

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

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. Lea este [cómo-para-responder] (http://stackoverflow.com/help/how-to-answer) para proporcionar una respuesta de calidad. – thewaywewere

Cuestiones relacionadas