2010-02-10 17 views
13

के लिए एक सीमा रहित विंडो बनाना मैं क्यूटी सी ++ में नया हूं। मैंने नवीनतम विंडोज संस्करण डाउनलोड किया, कुछ ट्यूटोरियल और इसकी महानता की।क्यूटी

मैंने कुछ स्टाइल विकल्पों को देखा जो कि क्यूटी ढांचे के पास हैं और यह बहुत अच्छा है, लेकिन अब मुझे अपने आवेदन को बनाने की जरूरत है कि इसकी मुख्य खिड़कियां (रूप) इसे आयताकार सीमाओं (सीमाहीन?) के बिना छवि के साथ डिज़ाइन/स्किन की गई है।

मैं इसे क्यूटी के साथ कैसे कर सकता हूं?

उत्तर

13

यदि आपका एक विजेट के आकार में कुछ उन्नत स्टाइल की तलाश में, हो सकता है इस उदाहरण से आपको मदद मिलेगी:

Shaped Clock Example

या हो सकता है आप बस ध्वज के इस प्रकार के लिए देख रहे: Qt::CustomizeWindowHint या बस Qt::FramelessWindowHint

+0

आकार घड़ी उदाहरण यह है, वहाँ इस तरह किसी भी अधिक उदाहरण है? – user63898

+0

मेरे ज्ञान के लिए नहीं ... दुर्भाग्य से ... –

+0

यहां कोड है: Qt :: WindowFlags flags = this-> windowFlags(); यह-> सेटविंडोफ्लैग (झंडे | क्यूटी :: FramelessWindowHint); – GeneCode

2

मैं इस में भाग गया और कुछ समय बाद इसे समझ लिया। विंडोज & मैकोज़ दोनों के लिए नमूना कोड के लिए https://github.com/ianbannerman/TrueFramelessWindow देखें।

क्यूटी :: FramelessWindowHint आकार बदलने और न्यूनतम/अधिकतम/बंद बलिदान, तो शायद यह नहीं है कि लोग क्या ढूंढ रहे हैं।

2

मैं कैसे Qt5 में फ्रेमलेस खिड़की की तरह VS2013 बनाने के लिए की एक छोटा सा उदाहरण, बनाया: screenshot (mac) qt frameless window with dark style

आप यहाँ पूरा सूत्रों प्राप्त कर सकते हैं: https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle

अन्यथा यहाँ कैसे एम्बेड करने के लिए की एक कोड सिंहावलोकन " मुख्य "मेनविंडो" बेकार "विंडो में। इसके अलावा आप देख सकते हैं कि टाइटलबार, बटन कैसे जोड़ें और बेकार विंडो का अधिकतम आकार बदलें, आकार बदलें और स्थानांतरित करें।

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

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। गुणवत्ता उत्तर प्रदान करने के लिए कृपया इसे [कैसे-जवाब दें] (http://stackoverflow.com/help/how-to-answer) पढ़ें। – thewaywewere