2017-04-10 1 views
0

Je veux créer une barre de titre personnalisée en qt. J'ai donc cherché quelques exemples et les ai suivis. Voici le code qui applique l'exemple.Je veux créer une barre de titre personnalisée en qt

fichier d'en-tête de Widget:

#include <QWidget> 
#include <QMouseEvent> 

class KcWdTitlebar :public QWidget 
{ 
private: 
    QWidget *m_parent; 
    QPoint m_pCursor; 

public: 
    KcWdTitlebar(QWidget *parent) ; 

protected: 
    void mousePressEvent(QMouseEvent *event); 
    void mouseMoveEvent(QMouseEvent *event); 
}; 

Widget cpp:

KcWdTitlebar::KcWdTitlebar(QWidget *parent) :m_parent(parent) 
{ 
    QLabel *title = new QLabel(parent->windowTitle()); 
    QPushButton *pPB = new QPushButton ("x"); 

    QHBoxLayout *layout = new QHBoxLayout(this); 
    layout->addWidget(title); 
    layout->addWidget(pPB); 

    connect(pPB,SIGNAL(clicked()),parent,SLOT(close())); 
} 

void KcWdTitlebar::mousePressEvent(QMouseEvent *event) 
{ 
    if(event->button() == Qt::LeftButton) 
    { 
     m_pCursor = event->globalPos() - geometry().topLeft(); 
     event->accept(); 
    } 
} 

void KcWdTitlebar::mouseMoveEvent(QMouseEvent *event) 
{ 
    if(event->buttons() & Qt::LeftButton) 
    { 
     m_parent->move(event->globalPos() - m_pCursor); 
     event->accept(); 
    } 
} 

tête MainWindow:

#include <QMainWindow> 
#include "KcWdTitlebar.h" 

namespace Ui { 
class mainwindow; 
} 

class mainwindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit mainwindow(QWidget *parent = 0); 
    ~mainwindow(); 

private: 
    KcWdTitlebar *m_title; 
    Ui::mainwindow *ui; 
}; 

mainwidow cpp:

mainwindow::mainwindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::mainwindow) 
{ 
    ui->setupUi(this); 
    m_title = new KcWdTitlebar(this); 
    ui->verticalLayout->addWidget(m_title); 

} 

Quand je lance ce code, cliquer et faire glisser la partie KcWdTitle forcera le mainwindow à suivre plus loin que le point que je clique dessus.

Quelles parties du code dois-je corriger?

J'espère que tout le monde peut comprendre mon anglais.

+0

essayer de changer: 'vide KcWdTitlebar :: mousePressEvent (* QMouseEvent événement)' et 'vide KcWdTitlebar :: mouseMoveEvent (QMouseEvent * event) 'et voir s'il y a un changement dans le comportement. Si c'est le cas, c'est la partie que vous devriez changer. – basslo

+0

Où est la définition complète de Ui :: mainwindow? –

+0

@DavidGrayson Il n'y a pas grand chose dans Ui :: mainwindow. Je viens d'ajouter KcWdTitlebar en haut du cadre. – minjee

Répondre

1

Vous devez modifier mousePressEvent() pour soustraire la géométrie MainWindow au lieu de la géométrie de la barre de titre.

Change:

m_pCursor = event->globalPos() - geometry().topLeft(); 

à ceci:

m_pCursor = event->globalPos() - m_parent->geometry().topLeft(); 
+0

Merci! Ça marche!!!! – minjee

+0

@minjee Content d'entendre! Pouvez-vous accepter ma réponse s'il vous plaît :) – mrg95