2017-07-11 22 views
1

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

+1

我不知道QSplitter是你正在寻找的部件?它将允许用户通过在它们之间的拖动条上向左或向右拖动来选择两个小部件的宽度。 –

回答

0

您可以使用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