2017-04-10 15 views
0

qtでカスタムタイトルバーを作成したいとします。Qtでカスタムタイトルバーを作成したい

私はいくつかの例を見て、それに従った。 例を適用するコードは次のとおりです。

ウィジェットヘッダファイル:

#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); 
}; 

ウィジェット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(); 
    } 
} 

メインウィンドウヘッダ:

#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); 

} 

私はこのコードを、 クリックを実行し、KcWdTitle部分をドラッグすると、メインウィンドウは、私がクリックした地点よりもさらに続くことになります

私はどのコードを修正する必要がありますか?

誰もが私の英語を理解できることを願っています。

+0

変更しよう: '無効KcWdTitlebar :: mousePressEvent(QMouseEvent *イベント)'と '無効KcWdTitlebar :: mouseMoveEvent(QMouseEvent *イベント) 'と行動の変化があるかどうかを確認してください。そうであれば、それはあなたが変えるべき部分です。 – basslo

+0

Ui :: mainwindowの完全な定義はどこにありますか? –

+0

@DavidGrayson Ui :: mainwindowにはあまりありません。私はちょうどフレームの上部にKcWdTitlebarを追加しました。 – minjee

答えて

1

mousePressEvent()を変更して、タイトルバーのジオメトリの代わりにMainWindowジオメトリを減算する必要があります。

変更:これに

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

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

ありがとう!それは働く!!!! – minjee

+0

@minjee聞いてうれしい!あなたは私の答えを受け入れることができます:) – mrg95

関連する問題