QT如何自定义控件并添加到控件列表,可以参考如下网页:
1、http://www.cnblogs.com/feiyangqingyun/p/6128288.html
2、http://blog.sina.com.cn/s/blog_a6fb6cc90102vsj1.html
这里我想记录的是,自定义的控件何时绘制的,绘制的大小如何制定的。
自定义控件需要定义一个控件的Class,控件的所有动作都在该class种实现,以前对界面编程没有深入理解,现在感觉其实所有的控件都是一个个class,与其他class没有区别,只是控件class主要精力是实现了绘图功能,以及鼠标键盘响应功能。
Qt中控件也是一个个Class,所以定义自定义控件需要创建一个class并继承与现有的控件class或者widget,作为父类的控件class或者QWidget class已经实现了大部分功能,并提供一些虚函数供子类实现,自定义控件类只需要重写或者增加少量的函数实现便可以生成一个不错控件。
在自定义控件类中个人理解有两个地方可以实现控件外观的定制,第一个是构造函数,第二个是paintEvnet函数。
1、在构造函数中其实不能很好的更改控件的外观,毕竟最后在控件显示前还是要调用父类的paintEvent进行外观绘制,构造函数中对控件外观的修改,主要是对父类控件外观的修补,外观框架仍然采用的是父类的框架。但构造函数中还是可以修改父类的一些特性,比如大小,image显示或者一些点击行为等,下面是一个switchButton的控件类的构造函数,在该构造函数中限定了控件大小与显示的图片等,通过图片替换方式实现开关按钮的开关动作。下图是一个自定义开关按钮。
SwitchButton::SwitchButton(QWidget *parent): QPushButton(parent) { setCursor(QCursor(Qt::PointingHandCursor)); isCheck = false; styleOn = "background-image: url(:/image/btncheckon.png); border: 0px;"; styleOff = "background-image: url(:/image/btncheckoff.png); border: 0px;"; setFocusPolicy(Qt::NoFocus); setFixedSize(87, 28); //不允许变化大小 setStyleSheet(styleOn);//设置当前样式 connect(this, SIGNAL(clicked()), this, SLOT(ChangeOnOff())); }
2、在paintEvent中重新绘制控件,可以灵活自由的创建想要的控件,不过需要编写的代码多些,如下代码中
resetVariables(&painter); drawBackground(&painter);//绘制背景 drawBox(&painter);//绘制控件外框 drawText(&painter);//绘制控件文本 drawGraph(&painter);//绘制控件内部图形 drawTitle(&painter);
,均是需要自己定义的函数,通过实现这些函数实现自定义的空间。
这里有一个细节,自己只是搞懂一部分,即绘制控件的坐标问题,控件绘制多大,以哪一点为基准点?其中一个方向是通过构造函数将父窗口指针传入,这样控件的所有坐标,长宽度等都可以以父窗口为基准了。但是我有一个疑问,是否可以不关联父窗口,在自定义控件中自己绘制一个指定大小的外框,坐标从(0,0)开始,并以此为基准绘制内部控件外观?这个看看能不能从自定义控件的源码中找到答案。
void myChart1::paintEvent(QPaintEvent *e) { QPainter painter; painter.begin(this); if(m_bUseAntialiasing) { painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing); } resetVariables(&painter); drawBackground(&painter);//绘制背景 drawBox(&painter);//绘制控件外框 drawText(&painter);//绘制控件文本 drawGraph(&painter);//绘制控件内部图形 drawTitle(&painter); }
mychart1=new myChart1(ui->fm2);//传入父窗口指针,从而获得fm2的很多重要属性