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

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

【问题讨论】:

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

标签: c++ qt qwidget


【解决方案1】:

您可以使用 QSplitter 做您想做的事。你可以在这里找到一个完整的例子:https://stackoverflow.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多