当前位置:编程学习 > wap >>

QTabWidget实现QQ聊天窗口的问题

    我现在要用Qt实现类似QQ聊天窗口的功能。就是可以把标签页上面的窗口拖出来,形成一个单独的窗口。还要能把拖出来的窗口再拖回去。
    我现在已经把拖出来的功能做好了,但是拖进去的功能始终有问题。按住窗口拖到TabBar上面的时候就会崩溃。
    我的环境是Qt5.0.2。下面贴关键部分代码。
1.首先是继承QTabBar的类
void DragTabbar::mousePressEvent(QMouseEvent *e)
{
    if(e->button() != Qt::LeftButton)
        return;

    bDrag=true;
    pressPoint=e->pos();

    QTabBar::mousePressEvent(e);
}

void DragTabbar::mouseMoveEvent(QMouseEvent *e)
{
    if(!bDrag)
        return;

    QPoint pos=e->pos();
    if( abs(pos.y()-pressPoint.y()) > this->height() )
    {
        return;
    }

    int index=currentIndex();
    emit DragStart(index);

    QTabBar::mouseMoveEvent(e);
}

void DragTabbar::mouseReleaseEvent(QMouseEvent *e)
{
    if(!bDrag)
        return;

    QPoint pos=e->pos();
    if( abs(pos.y()-pressPoint.y()) < this->height() )
    {
        return;
    }

    int index=currentIndex();
    emit DragEnd(pos);
    bDrag=false;

    QTabBar::mouseReleaseEvent(e);
}


2.继承QTabWidget
DragTabWidget::DragTabWidget(QWidget *parent) :
    QTabWidget(parent)
{
    dragbar=new DragTabbar(this);
    setTabBar(dragbar);
    setMouseTracking(true);

    connect(dragbar, SIGNAL(DragStart(int)), this, SLOT(DragStart(int)));
    connect(dragbar, SIGNAL(DragEnd(QPoint)), this, SLOT(DragEnd(QPoint)));
}

void DragTabWidget::DragStart(int index)
{
    sOutText=this->tabText(index);
    pOutWidget=widget(index);
    outindex=index;
}

void DragTabWidget::DragEnd(QPoint point)
{
    pOutWidget->setParent(NULL);
    pOutWidget->setWindowTitle(sOutText);
    pOutWidget->move(point);
    pOutWidget->show();

    QString sCount;
    sCount.sprintf("DragEnd  count=%d", count());
    qDebug()<<sCount;

    if(this->count()==0)
    {
        QWidget *pWidget=new QWidget(this);
        addTab(pWidget, "");
    }
}

int DragTabWidget::AddTab(QWidget *widget, const QString &label)
{
    connect(widget, SIGNAL(Move(QPoint)), this, SLOT(InsertTab(QPoint)));
    return addTab(widget, label);
}

void DragTabWidget::InsertTab(QPoint point)
{
    QPoint tabPoint=this->pos();
    QPoint tabDeskPoint=QWidget::mapToGlobal(tabPoint);

    int barLeft=tabDeskPoint.x();
    int barRight=tabDeskPoint.x()+this->width();
    int barTop=tabDeskPoint.y()+28;
    int barBottom=tabDeskPoint.y()+28+dragbar->getBarHeight();

    if( (point.x()>barLeft && point.x()<barRight) &&
        (point.y()>barTop && point.y()<barBottom)
      )
    {
/*
        QString sTabPoint;
        sTabPoint.sprintf("TabDialog:x=%d, y=%d", point.x(), point.y());
        qDebug()<<sTabPoint;
        QString sTabDeskPoint;
        sTabDeskPoint.sprintf("MainWindow:x=%d, y=%d", tabDeskPoint.x(), tabDeskPoint.y());
        qDebug()<<sTabDeskPoint;
*/

        dragbar->addTab(sOutText);

        QString sCount;
        sCount.sprintf("InsertTab  count=%d", count());
        qDebug()<<sCount;

        int index=count();
        insertTab(index, pOutWidget, QIcon(), sOutText);
    }//End if
}
Qt --------------------编程问答-------------------- 能否提供全部的源代码? --------------------编程问答-------------------- dragtabbar.h
#ifndef DRAGTABBAR_H
#define DRAGTABBAR_H

#include <QTabBar>
#include <QMouseEvent>
#include <QPoint>

class DragTabbar : public QTabBar
{
    Q_OBJECT
public:
    explicit DragTabbar(QWidget *parent = 0);

protected:
    virtual void mousePressEvent(QMouseEvent *e);
    virtual void mouseMoveEvent(QMouseEvent *e);
    virtual void mouseReleaseEvent(QMouseEvent *e);

signals:
    void DragStart(int index);
    void DragEnd(QPoint point);

private:
    QPoint pressPoint;
    bool bDrag;
};

#endif // DRAGTABBAR_H


dragtabbar.cpp
#include "dragtabbar.h"
#include <QMessageBox>
#include <QString>

DragTabbar::DragTabbar(QWidget *parent) :
    QTabBar(parent), bDrag(false)
{
}

void DragTabbar::mousePressEvent(QMouseEvent *e)
{
    if(e->button() != Qt::LeftButton)
        return;

    bDrag=true;
    pressPoint=e->pos();

    QTabBar::mousePressEvent(e);
}

void DragTabbar::mouseMoveEvent(QMouseEvent *e)
{
    if(!bDrag)
        return;

    QPoint pos=e->pos();
    if( abs(pos.y()-pressPoint.y()) > this->height() )
    {
        return;
    }

    int index=currentIndex();
    emit DragStart(index);

    QTabBar::mouseMoveEvent(e);
}

void DragTabbar::mouseReleaseEvent(QMouseEvent *e)
{
    if(!bDrag)
        return;

    QPoint pos=e->pos();
    if( abs(pos.y()-pressPoint.y()) < this->height() )
    {
        return;
    }

    int index=currentIndex();
    emit DragEnd(pos);
    bDrag=false;

    QTabBar::mouseReleaseEvent(e);
}


dragtabwidget.h
#ifndef DRAGTABWIDGET_H
#define DRAGTABWIDGET_H

#include <QTabWidget>
#include <QMouseEvent>
#include "dragtabbar.h"

class DragTabWidget : public QTabWidget
{
    Q_OBJECT
public:
    explicit DragTabWidget(QWidget *parent = 0);

    int AddTab(QWidget *widget, const QString &label);
    
signals:
    
public slots:
    void DragStart(int index);
    void DragEnd(QPoint point);
    void InsertTab(QPoint point);

protected:
    DragTabbar *dragbar;
    QWidget *pOutWidget;
    int outindex;
    QString sOutText;
};

#endif // DRAGTABWIDGET_H


dragtabwidget.cpp
#include "dragtabwidget.h"
#include <QMessageBox>
#include <QString>
#include <QDebug>


DragTabWidget::DragTabWidget(QWidget *parent) :
    QTabWidget(parent)
{
    dragbar=new DragTabbar(this);
    setTabBar(dragbar);
    setMouseTracking(true);

    connect(dragbar, SIGNAL(DragStart(int)), this, SLOT(DragStart(int)));
    connect(dragbar, SIGNAL(DragEnd(QPoint)), this, SLOT(DragEnd(QPoint)));
}

void DragTabWidget::DragStart(int index)
{
    sOutText=this->tabText(index);
    pOutWidget=widget(index);
    outindex=index;
}

void DragTabWidget::DragEnd(QPoint point)
{
    pOutWidget->setParent(NULL);
    pOutWidget->setWindowTitle(sOutText);
    pOutWidget->move(point);
    pOutWidget->show();
}

int DragTabWidget::AddTab(QWidget *widget, const QString &label)
{
    connect(widget, SIGNAL(Move(QPoint)), this, SLOT(InsertTab(QPoint)));
    return addTab(widget, label);
}

void DragTabWidget::InsertTab(QPoint point)
{
    QPoint tabPoint=this->pos();
    QPoint tabDeskPoint=QWidget::mapToGlobal(tabPoint);

    int barLeft=tabDeskPoint.x();
    int barRight=tabDeskPoint.x()+this->width();
    int barTop=tabDeskPoint.y()+28;
    int barBottom=tabDeskPoint.y()+28+dragbar->height();

    if( (point.x()>barLeft && point.x()<barRight) &&
        (point.y()>barTop && point.y()<barBottom)
      )
    {
        int index=count();
        insertTab(index, pOutWidget, QIcon(), sOutText);
    }//End if
}


tabdialog.h
#ifndef TABDIALOG_H
#define TABDIALOG_H

#include <QDialog>
#include <QLabel>
#include <QString>
#include <QPaintEvent>
#include <QMoveEvent>
#include <QPoint>


class TabDialog : public QDialog
{
    Q_OBJECT
public:
    explicit TabDialog(const QString& txt, const QColor &color, QWidget *parent = 0);
    
signals:
    void Move(QPoint point);

public slots:
    
protected:
    virtual void paintEvent(QPaintEvent *);
    virtual void moveEvent(QMoveEvent *e);

private:
    QLabel *txtLabel;
    QColor pencolor;
};

#endif // TABDIALOG_H


tabdialog.cpp
#include "tabdialog.h"
#include <QHBoxLayout>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QSize>
#include <QString>
#include <QDebug>


TabDialog::TabDialog(const QString& txt, const QColor &color, QWidget *parent) :
    QDialog(parent)
{
    txtLabel=new QLabel(txt);
    pencolor=color;

    QHBoxLayout *pMainBox=new QHBoxLayout();
    pMainBox->addWidget(txtLabel);

    setLayout(pMainBox);
}

void TabDialog::paintEvent(QPaintEvent *)
{
    QPainter paint(this);
    QPen pen;
    pen.setColor(pencolor);
    pen.setWidth(5);
    paint.setPen(pen);

    QSize dlgSize=this->size();
    paint.drawRect(0, 0, dlgSize.width()-1, dlgSize.height()-1);
}

void TabDialog::moveEvent(QMoveEvent *e)
{
    QPoint point=e->pos();
    emit Move(point);
}


mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QPoint>
#include "dragtabwidget.h"
#include "tabdialog.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    DragTabWidget *tab;
    TabDialog *dlg1;
    TabDialog *dlg2;
    TabDialog *dlg3;
};

#endif // MAINWINDOW_H


mainwindow.cpp
#include "mainwindow.h"
#include <QDebug>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(400, 300);

    tab=new DragTabWidget(this);
    tab->setTabsClosable(true);
    tab->setMovable(true);
    dlg1=new TabDialog("this is dialog one", Qt::red);
    dlg2=new TabDialog("this is dialog two", Qt::green);
    dlg3=new TabDialog("this is dialog three", Qt::blue);

    tab->AddTab(dlg1, "dlg1");
    tab->AddTab(dlg2, "dlg2");
    tab->AddTab(dlg3, "dlg3");

    setCentralWidget(tab);
    tab->show();
}

MainWindow::~MainWindow()
{
}
--------------------编程问答-------------------- 嗨。。。没人回帖。希望论坛内能有大神帮助我下,我的QQ是:895837110。
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,