好的,所以我用Qt的拖放部分创建了我的UI,在Ui我创建了一个" Tab Widget"在另一个" Tab Widget"。现在,在第二个Tab Widget里面我创建了一个Frame
我的问题是,我如何在Qt的这个框架上绘制?
我试过这个,但没有运气。我已经尝试了不同的方法来实现这个,程序运行良好,但当我去看看框架是否被绘制,我什么也看不见...请帮我这个,代码示例和所有。提前谢谢。
void 2ndMainWindow::paintEvent(QPaintEvent *e)
{
QPainter paint(ui->rightTriangle_frame);
paint.drawEllipse(10,10,100,100);
paint.setPen(Qt::red);
paint.end();
}
我的头文件包含在私人广告位
下 Ui::GeometryMainWindow *ui;
QGraphicsScene *scene;
QGraphicsEllipseItem *ellipse;
QGraphicsRectItem *rectangle;
ui->setupUi(this);
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
QBrush redBrush(Qt::red);
QBrush blueBrush(Qt::blue);
QPen blackpen(Qt::black);
blackpen.setWidth(6);
ellipse = scene->addEllipse(10,10,100,100,blackpen,redBrush);
答案 0 :(得分:2)
如果您要在QFrame上绘制一些自定义形状,我建议您使用QGraphicsView而不是QFrame。实现窗口小部件的paintEvent可能会产生性能问题。如果您使用QGraphicsView,您可以创建一个QGraphicsScene并将您的项目添加到该场景,这是执行此类内容的一般和可接受的方式。
或者,实现如下的eventFilter,
bool 2ndMainWindow::eventFilter(QObject *o, QEvent *e)
{
if (e->type() == QEvent::Paint) {
paintEvent((QPaintEvent *)e);
}
return QMainWindow::eventFilter(o, e);
}
在主窗口添加的构造函数中,
installEventFilter(this);
顺便说一句,你应该在paintEvent函数中绘制椭圆之前设置笔。
答案 1 :(得分:1)
您似乎正在覆盖主窗口的paintEvent()
方法,并从那里尝试在框架窗口小部件上绘画。查看您的控制台输出 - 您应该收到类似
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setPen: Painter not active
QPainter::end: Painter not active, aborted
相反,继承你的QFrame
小部件(在Qt设计器中,选择“Promote to ...”来定义用户定义的子类),在这个子类中,覆盖paintEvent
,如下所示:
void MyFrame::paintEvent(QPaintEvent *e) {
QPainter paint(this);
paint.setPen(Qt::red);
paint.drawEllipse(10,10,100,100);
paint.end();
QFrame::paintEvent(e);
}
请注意,为了绘制红色椭圆,您需要在绘制椭圆之前设置笔颜色。您还应该调用父类的paintEvent()
方法来绘制框架边框。
有关SSCCE,请参阅https://github.com/afester/StackOverflow/tree/master/QtRepaint。