Qt工作笔记-可拖动大小的QListWidget(自定义控件方式)

运行截图如下:


代码如下:

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

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/80610023