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) :Qt --------------------编程问答-------------------- 能否提供全部的源代码? --------------------编程问答-------------------- dragtabbar.h
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
}
#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"--------------------编程问答-------------------- 嗨。。。没人回帖。希望论坛内能有大神帮助我下,我的QQ是:895837110。
#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()
{
}
补充:移动开发 , Qt