【问题标题】:Implementing resize handles on QRubberband? Is QSizeGrip relevant?在 QRubberband 上实现调整大小句柄? QSizeGrip 是否相关?
【发布时间】:2013-10-04 16:45:08
【问题描述】:

我想让我的QRubberband 实例用户可调整大小。我已经看到这个问题here,但没有解决方案。

用例是用户可以在照片上拖出选择框,然后通过拖动QRubberband 边距来更改几何图形,或通过拖动选择重新定位现有几何图形来进行微调。我已经实现了重新定位,但我想知道调整手柄大小以更改 QRubberband 的几何形状。

这里可以使用 QSizeGrip 吗?除此之外,是否有一种标准方法来检查 Qt 内的鼠标在边距内类型事件或其他一些方法来实现这一点?这适用于不需要或保证在此功能上付出大量努力但拥有它会很好的研究应用程序。

【问题讨论】:

    标签: c++ qt qtwidgets


    【解决方案1】:

    如果其他人在 Google 之外徘徊并打算将其与 PyQt 一起使用,这里是 @pavel-strakhov 的 C++ 示例的等效 Python 代码,我可以确认它在 *buntu Linux 14.04 LTS 上适用于我系统提供的 Python 3.4 和 PyQt 5.2.1。

    (需要注意的是,我选择的小部件主题不知道如何旋转左上角的 QSizeGrip,因此两个角的手柄看起来相同。)

    来源:

    class ResizableRubberBand(QWidget):
        """Wrapper to make QRubberBand mouse-resizable using QSizeGrip
    
        Source: http://stackoverflow.com/a/19067132/435253
        """
        def __init__(self, parent=None):
            super(ResizableRubberBand, self).__init__(parent)
    
            self.setWindowFlags(Qt.SubWindow)
            self.layout = QHBoxLayout(self)
            self.layout.setContentsMargins(0, 0, 0, 0)
    
            self.grip1 = QSizeGrip(self)
            self.grip2 = QSizeGrip(self)
            self.layout.addWidget(self.grip1, 0, Qt.AlignLeft | Qt.AlignTop)
            self.layout.addWidget(self.grip2, 0, Qt.AlignRight | Qt.AlignBottom)
    
            self.rubberband = QRubberBand(QRubberBand.Rectangle, self)
            self.rubberband.move(0, 0)
            self.rubberband.show()
            self.show()
    
        def resizeEvent(self, event):
            self.rubberband.resize(self.size())
    

    用法:

    self.band = ResizableRubberBand(ui.label)
    self.band.move(100, 100)
    self.band.resize(50, 50)
    self.band.setMinimumSize(30, 30)
    

    【讨论】:

    • 我向那些认为这无关紧要以至于不能投反对票的人道歉,但这是我发现与在 PyQt 中实现这一目标有任何重大相关性的唯一 Google 结果,所以我认为冒险投反对票是值得的,以帮助其他徘徊的 PyQt 用户。
    【解决方案2】:

    是的,这是可能的。这是实现:

    标题:

    class Resizable_rubber_band : public QWidget {
    public:
      Resizable_rubber_band(QWidget* parent = 0);
    
    private:
      QRubberBand* rubberband;
      void resizeEvent(QResizeEvent *);
    
    };
    

    来源:

    Resizable_rubber_band::Resizable_rubber_band(QWidget *parent) : QWidget(parent) {
      //tell QSizeGrip to resize this widget instead of top-level window
      setWindowFlags(Qt::SubWindow);
      QHBoxLayout* layout = new QHBoxLayout(this);
      layout->setContentsMargins(0, 0, 0, 0);
      QSizeGrip* grip1 = new QSizeGrip(this);
      QSizeGrip* grip2 = new QSizeGrip(this);
      layout->addWidget(grip1, 0, Qt::AlignLeft | Qt::AlignTop);
      layout->addWidget(grip2, 0, Qt::AlignRight | Qt::AlignBottom);
      rubberband = new QRubberBand(QRubberBand::Rectangle, this);
      rubberband->move(0, 0);
      rubberband->show();
      show();
    }
    
    void Resizable_rubber_band::resizeEvent(QResizeEvent *) {
      rubberband->resize(size());
    }
    

    用法:(ui->label是用于显示要裁剪的图像的标签)

    Resizable_rubber_band* band = new Resizable_rubber_band(ui->label);
    band->move(100, 100);
    band->resize(50, 50);
    band->setMinimumSize(30, 30);
    

    【讨论】:

    • 看起来不错。太糟糕了,我今天没有可用的选票。
    • 感谢您的意见。看起来很有希望,但我还没有让它工作。在一个只有 QLabel 的新测试 Qt 应用程序项目中,我看到了橡皮筋,但仅此而已。我需要实现一些隐含的方法吗?我为 QLabel 启用了 mouseTracking。
    • 在使用 Qt5 的新干净项目中对我来说效果很好。完整项目来源:gist.github.com/Riateche/6743108截图:i.imgur.com/D212BtQ.png
    • 感谢您的打扰。在这里运行您的项目,但仍然没有成功 - OSX 下的 Qt 5.1.1。多么奇怪。我将橡皮筋框设置为初始大小/位置,但没有调整大小手柄/没有交互。也许这是 OSX 上的问题。
    猜你喜欢
    • 2020-10-26
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多