我想让我的QRubberband实例用户可以调整大小.我在这里看到了这个问题,但没有解决方案.
用例是用户可以在照片上拖出选择框,然后通过拖动QRubberband边距来更改几何图形进行微调,或者通过拖动选区重新定位现有几何图形.我已经实现了重新定位,但我想知道调整大小的句柄来改变QRubberband的几何形状.
可以在这里使用QSizeGrip吗?除此之外,是否有一种标准方法可以检查鼠标内边缘类型的事件,Qt或者以其他方式实现这一点?这是一个研究应用程序,不需要或保证在此功能上付出很多努力,但它会很好.
Pav*_*hov 28
是的,这是可能的.这是实施:
标题:
class Resizable_rubber_band : public QWidget {
public:
Resizable_rubber_band(QWidget* parent = 0);
private:
QRubberBand* rubberband;
void resizeEvent(QResizeEvent *);
};
Run Code Online (Sandbox Code Playgroud)
资源:
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());
}
Run Code Online (Sandbox Code Playgroud)
用法:( ui->label是用于显示要裁剪的图像的标签)
Resizable_rubber_band* band = new Resizable_rubber_band(ui->label);
band->move(100, 100);
band->resize(50, 50);
band->setMinimumSize(30, 30);
Run Code Online (Sandbox Code Playgroud)

如果有其他人想在PyQt上使用它,请在Google之外徘徊,这是@ 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())
Run Code Online (Sandbox Code Playgroud)
用法:
self.band = ResizableRubberBand(ui.label)
self.band.move(100, 100)
self.band.resize(50, 50)
self.band.setMinimumSize(30, 30)
Run Code Online (Sandbox Code Playgroud)