运行截图如下:
代码如下:
mylistwidget.h
#ifndef MYLISTWIDGET_H #define MYLISTWIDGET_H #include <QObject> #include <QListWidget> class MyListWidget : public QListWidget { Q_OBJECT public: MyListWidget(QWidget *parent = 0); void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); public slots: void receiverData(QPoint pos); signals: void wantToGetPoint(); private: bool m_dragFlag; int m_currX,m_currY;//当前的控件的宽度和高度 bool m_leftFlag,m_rightFlag; //是拖动左边还是右边 int m_currWinX,m_currWinY; //当前窗口X坐标与Y坐标 int m_widgetX,m_widgetY; //控件所处的坐标 }; #endif // MYLISTWIDGET_H
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include "mylistwidget.h" namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); public slots: void receiverSIGNAL(); signals: void sendPoint(QPoint pos); private: Ui::Widget *ui; }; #endif // WIDGET_H
mian.cpp
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
mylistwidget.cpp
#include "mylistwidget.h" #include <QMouseEvent> #include <QDebug> #include <QCursor> MyListWidget::MyListWidget(QWidget *parent): QListWidget(parent), m_dragFlag(false), m_leftFlag(false), m_rightFlag(false) { } void MyListWidget::mousePressEvent(QMouseEvent *event) { if(event->x()<=15){ //左边 this->setCursor(Qt::SizeHorCursor); m_dragFlag=true; m_leftFlag=true; m_rightFlag=false; } else if(event->x()>=this->width()-15){ //右边 this->setCursor(Qt::SizeHorCursor); m_dragFlag=true; m_leftFlag=false; m_rightFlag=true; } m_currX=this->width(); m_currY=this->height(); m_widgetX=this->pos().x(); m_widgetY=this->pos().y(); event->ignore(); } void MyListWidget::mouseMoveEvent(QMouseEvent *event) { if(m_dragFlag){ //分左右考虑 if(m_leftFlag){ emit wantToGetPoint(); this->setGeometry(m_currWinX,this->pos().y(),m_currX+(m_widgetX-m_currWinX),m_currY); } else if(m_rightFlag){ this->resize(event->x(),m_currY); } else{ } } //qDebug()<<"x:"<<event->x(); } void MyListWidget::mouseReleaseEvent(QMouseEvent *event) { this->setCursor(Qt::ArrowCursor); m_dragFlag=false; } void MyListWidget::receiverData(QPoint pos) { this->m_currWinX=pos.x(); this->m_currWinY=pos.y(); }
widget.cpp
#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QMouseEvent> #include <QCursor> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); connect(ui->widget,SIGNAL(wantToGetPoint()),this,SLOT(receiverSIGNAL())); connect(this,SIGNAL(sendPoint(QPoint)),ui->widget,SLOT(receiverData(QPoint))); ui->treeView->setMouseTracking(true); for(int i=0;i<5;i++){ ui->widget->insertItem(0,"*****第"+QString::number(i)+"行*****"); } } Widget::~Widget() { delete ui; } void Widget::receiverSIGNAL() { QPoint point=mapFromGlobal(QCursor::pos()); //qDebug()<<point; 不要直接把mapFromGlobal(QCursor::pos())传进去,不然有BUG emit this->sendPoint(point); }