日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT-在子控件上绘图的两种方式

發(fā)布時(shí)間:2023/12/18 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT-在子控件上绘图的两种方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Qt 在控件上面繪圖 label,pushbutton。。。。。

1、構(gòu)建一個(gè)新類來調(diào)用該控件的繪圖函數(shù),新類重寫 paintEvent(QPaintEvent *)

?構(gòu)建:
class DrawGraphLab : public QLabel
{
? ? Q_OBJECT
public:
? ? explicit DrawGraphLab( QWidget* parent = 0);

protected:
? ? void paintEvent(QPaintEvent *event);
};
?實(shí)現(xiàn):
DrawGraphLab::DrawGraphLab(QWidget* parent) : QLabel(parent)
{
}
void DrawGraphLab::paintEvent(QPaintEvent *)
{
//繪制線條
? ? QPainter painter;
? ? painter.begin(this);
? ? painter.setPen(QPen(QColor(132, 130, 130) ,4) );
? ? painter.drawLine(951/2, 120, 951/2, 430);
? ? painter.drawRect(10,10,200,200);
? ? painter.end();
}
??調(diào)用
void RoutePage::init_ui()
{
? ? QLabel* p_station_tab = new QLabel(this);
? ? p_station_tab->setGeometry(79, 66, 951, 537 );
? ? p_station_tab->setPixmap(QPixmap(":/res/Route/icon_station_show.png"));
? ? //在p_station_tab控件上繪制圖形
? ? DrawGraphLab* p_draw_graph_lab = new DrawGraphLab(p_station_tab);
? ? p_draw_graph_lab->setGeometry( p_station_tab->geometry() );
}

2、Qt的事件過濾器去不需要過濾的繪圖控件。即重寫eventFilter(QObject *watched, QEvent *event) ?(不需要構(gòu)建新類)
//Qt 之所以不能在在任意控件上面繪圖,是因?yàn)镼t的事件過濾器把控件的繪圖事件給過濾了

?添加類成員
class RoutePage : public QDialog
{
? ? Q_OBJECT
public:
? ? explicit RoutePage(QWidget *parent = 0);
? ? ~RoutePage();
? ? void init_ui();

? ? QLabel* p_station_tab;
? ? QLabel* p_draw_graph_lab;

? ? bool eventFilter(QObject *watched, QEvent *event);
? ? void magicTime();
}
?重寫eventFilter
bool RoutePage::eventFilter(QObject *watched, QEvent *event)
{
? ? if(watched == p_draw_graph_lab && event->type() == QEvent::Paint)
? ? {
? ? ? ? magicTime();
? ? }
? ? return QWidget::eventFilter(watched,event);
}
void RoutePage::magicTime()
{
? ? qDebug()<<"fdskjfhjksdhfjksdhfkjsdhfksdjhfdsjfkjsdh";
? ? QPainter painter;
? ? painter.begin(p_draw_graph_lab);
? ? painter.setPen(QPen(QColor(132, 130, 130) ,4) );
? ? painter.drawLine(951/2, 120, 951/2, 430);
? ? painter.drawRect(10,10,200,200);
? ? painter.end();
}
??調(diào)用
void RoutePage::init_ui()
{
? ? p_station_tab = new QLabel(this);
? ? p_station_tab->setGeometry(79, 66, 951, 537 );
? ? p_station_tab->setPixmap(QPixmap(":/res/Route/icon_station_show.png"));
? ? //在p_station_tab控件上繪制圖形
? ? p_draw_graph_lab = new DrawGraphLab(p_station_tab);
? ? p_draw_graph_lab->setGeometry( p_station_tab->geometry() );
? ? //在主Widget加入過濾事件
? ? p_draw_graph_lab->installEventFilter(this);
}
?

總結(jié)

以上是生活随笔為你收集整理的QT-在子控件上绘图的两种方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。