用鼠标改变 QWidget 的宽度

Posted

技术标签:

【中文标题】用鼠标改变 QWidget 的宽度【英文标题】:Changing width of QWidget with mouse 【发布时间】:2017-07-11 00:15:34 【问题描述】:

我在 QHBoxLayout 中有两个 QWidget。我希望能够通过单击其右侧并移动鼠标(例如 Qt 编辑器的项目浏览器)来更改左侧 QWidget 的宽度。

【问题讨论】:

我想知道 QSplitter 是否是您正在寻找的小部件?它允许用户通过在它们之间的拖动条上向左或向右拖动来选择两个小部件的宽度。 【参考方案1】:

您可以使用 QSplitter 做您想做的事。你可以在这里找到一个完整的例子:https://***.com/a/38433287/4297146

【讨论】:

【参考方案2】:

您可以使用eventFilter 并让鼠标移动、输入、离开和鼠标单击小部件。

检查这个例子: 我用QHBoxLayout 制作了两个小部件,并分别获得了QEvent::HoverEnterQEvent::MouseButtonPress

.cpp 文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);

    widgetOneW = 300;
    widgetTwoW = 300;

    ui->widgetOne->installEventFilter(this);
    ui->widgetTwo->installEventFilter(this);

    ui->widgetOne->setAttribute(Qt::WA_Hover);
    ui->widgetTwo->setAttribute(Qt::WA_Hover);


bool MainWindow::eventFilter(QObject *object, QEvent *event)

    if ((object == ui->widgetOne) && (event->type() == QEvent::HoverEnter))
    
        ui->widgetOne->resize(100, ui->widgetOne->height());
        ui->widgetTwo->resize(widgetTwoW, ui->widgetTwo->height());
        return true;
    
    else if ((object == ui->widgetOne) && (event->type() == QEvent::MouseButtonPress))
    
        QMouseEvent *keyEvent = static_cast<QMouseEvent *> (event);
        if(keyEvent->button() == Qt::LeftButton)
        
            ui->widgetOne->resize(100, ui->widgetOne->height());
            ui->widgetTwo->resize(widgetTwoW, ui->widgetTwo->height());
            return true;
        
    
    else if ((object == ui->widgetTwo) && (event->type() == QEvent::HoverEnter))
    
            ui->widgetOne->resize(widgetOneW, ui->widgetOne->height());
            ui->widgetTwo->resize(100, ui->widgetTwo->height());
            return true;
    
    else if ((object == ui->widgetTwo) && (event->type() == QEvent::MouseButtonPress))
    
        QMouseEvent *keyEvent = static_cast<QMouseEvent *> (event);
        if(keyEvent->button() == Qt::LeftButton)
        
            ui->widgetOne->resize(widgetOneW, ui->widgetOne->height());
            ui->widgetTwo->resize(100, ui->widgetTwo->height());
        
    



MainWindow::~MainWindow()

    delete ui;

.h 文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QKeyEvent>

namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    int widgetOneW;
    int widgetTwoW;

public slots:
    bool eventFilter(QObject *object, QEvent *event);

private:
    Ui::MainWindow *ui;
;

#endif // MAINWINDOW_H

.pro 文件:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = first
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

【讨论】:

以上是关于用鼠标改变 QWidget 的宽度的主要内容,如果未能解决你的问题,请参考以下文章

QWidget 在鼠标按下事件后没有响应。

使自定义 QWidget 可选

创建 QWidget 宽度 HWND 父级

在pyqt5中的QWidget上实现dragMoveEvent?

如何将QWidget的Wheel事件重定向到QTextEdit

QWidget 报告错误的宽度值