2017-07-11 2 views
1

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

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. –

Répondre

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