运行效果
代码
在 Qt 中,你可以使用 QGraphicsView 框架来实现一个包含两个矩形的场景,并实现点击选中效果。以下是一个简单的示例代码,展示了如何实现这个功能:
- 创建一个自定义的
QGraphicsRectItem
类,用于处理矩形的选中和未选中状态。 - 使用
QGraphicsView
和QGraphicsScene
来显示和管理这些矩形。 - 通过鼠标事件来实现矩形的选中效果。
以下是完整的示例代码:
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QPen>
#include <QBrush>
class SelectableRectItem : public QGraphicsRectItem {
public:
SelectableRectItem(QRectF rect) : QGraphicsRectItem(rect), isSelected(false) {
setAcceptedMouseButtons(Qt::LeftButton);
updateAppearance();
}
void setSelected(bool selected) {
isSelected = selected;
updateAppearance();
}
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event) override {
// Toggle selection state on click
setSelected(!isSelected);
QGraphicsItem::mousePressEvent(event); // Call base class implementation
}
private:
void updateAppearance() {
if (isSelected) {
setPen(QPen(Qt::red, 2));
setBrush(QBrush(Qt::yellow));
} else {
setPen(QPen(Qt::black, 1));
setBrush(QBrush(Qt::NoBrush));
}
}
bool isSelected;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// Create scene
QGraphicsScene scene;
// Create two rectangles
SelectableRectItem *rect1 = new SelectableRectItem(QRectF(0, 0, 100, 100));
SelectableRectItem *rect2 = new SelectableRectItem(QRectF(150, 0, 100, 100));
// Add rectangles to the scene
scene.addItem(rect1);
scene.addItem(rect2);
// Create view
QGraphicsView view(&scene);
view.setRenderHint(QPainter::Antialiasing);
view.setSceneRect(0, 0, 300, 200);
view.show();
return app.exec();
}
代码解释:
- SelectableRectItem 类:
- 继承自
QGraphicsRectItem
,用于表示可选中的矩形。 - 通过
setSelected
方法设置矩形的选中状态,改变边框颜色和填充颜色。 - 重写
mousePressEvent
方法,当鼠标左键点击时,设置矩形为选中状态。
- 继承自
- main 函数:
- 创建
QApplication
对象。 - 创建
QGraphicsScene
对象,用于管理图形项。 - 创建两个
SelectableRectItem
对象,并添加到场景中。 - 创建
QGraphicsView
对象,用于显示场景。 - 设置视图的渲染提示和场景矩形,然后显示视图。
- 创建
运行效果:
- 初始时,两个矩形都是未选中状态,边框为黑色,没有填充色。
- 点击任意一个矩形,该矩形的边框变为红色,填充色变为黄色,表示被选中。
这样,你就可以在 Qt 中实现一个简单的场景,包含两个矩形,并且可以通过点击来选择矩形,并有明显的选中和未选中效果区分。