用鼠标改变 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::HoverEnter
和QEvent::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 的宽度的主要内容,如果未能解决你的问题,请参考以下文章
在pyqt5中的QWidget上实现dragMoveEvent?