QT-在子控件上绘图的两种方式
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 查看 MySQL 版本的四种
- 下一篇: s3c2440移植MQTT