J'ai deux QWidgets dans un QHBoxLayout. Je veux pouvoir changer la largeur du QWidget gauche en cliquant sur son côté droit et en déplaçant la souris (comme le navigateur de projets de Qt Editor).Modification de la largeur de QWidget avec la souris
1
A
Répondre
2
Vous pouvez faire exactement ce que vous voulez par nous QSplitter. Vous pouvez trouver un exemple complet ici: https://stackoverflow.com/a/38433287/4297146
0
Vous pouvez utiliser eventFilter
et obtenir la souris Move, Enter, Leave et un clic de souris sur un widget.
Vérifiez cet exemple: J'ai fait deux widget avec QHBoxLayout
et obtenir QEvent::HoverEnter
et QEvent::MouseButtonPress
pour les deux.
fichier .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
fichier .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
Je me demande si QSplitter est le widget que vous cherchez? Cela vous permet de choisir la largeur des deux widgets en les faisant glisser vers la gauche ou vers la droite sur la barre de défilement qui les sépare. –