当前位置:   article > 正文

Qt学习之自定义窗口部件_qt 自定义窗口部件

qt 自定义窗口部件

自定义Qt窗口部件

实现一个十六进制的SpinBox,一般SpinBox只支持十进制整数,但是可以子类化方法实现该功能
需重新实现以下虚函数
  1. virtual QString textFromValue ( int value ) const
  2. virtual int valueFromText ( const QString & text ) const
例如:(摘抄自QtAssitant)
  1. int IconSizeSpinBox::valueFromText(const QString &text) const
  2. {
  3. QRegExp regExp(tr("(\\d+)(\\s*[xx]\\s*\\d+)?"));
  4. if (regExp.exactMatch(text)) {
  5. return regExp.cap(1).toInt();
  6. } else {
  7. return 0;
  8. }
  9. }
  10. QString IconSizeSpinBox::textFromValue(int value) const
  11. {
  12. return tr("%1 x %1").arg(value);
  13. }
自己实现hexspinBox的代码
  1. #ifndef HEXSPINBOX_H
  2. #define HEXSPINBOX_H
  3. #include <QSpinBox>
  4. class QRegExpValidator;
  5. class hexspinBox : public QSpinBox
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit hexspinBox(QWidget *parent = 0);
  10. ~hexspinBox();
  11. protected:
  12. //重写基类函数
  13. QValidator::State validate(QString &input, int &pos) const;
  14. int valueFromText(const QString &text) const;
  15. QString textFromValue(int val) const;
  16. private:
  17. QRegExpValidator *validator;
  18. };
  19. #endif // HEXSPINBOX_H
//实现代码
  1. #include "hexspinbox.h"
  2. #include <QSpinBox>
  3. hexspinBox::hexspinBox(QWidget *parent) :
  4. QSpinBox(parent)
  5. {
  6. setRange(0, 255);
  7. validator = new QRegExpValidator(QRegExp("[0-9A-Fa-F]{0, 8}"), this);
  8. }
  9. QValidator::State hexspinBox::validate(QString &input, int &pos) const{
  10. return validator->validate(input, pos);
  11. }
  12. QString hexspinBox::textFromValue(int val) const{
  13. return QString::number(val, 16).toUpper();
  14. }
  15. int hexspinBox::valueFromText(const QString &text) const{
  16. bool ok;
  17. return text.toInt(&ok, 16);
  18. }

子类化QWidget

当手里没有任何一个Qt窗口部件能够满足任何任务需求时,我们可以创建自己想要的窗口部件。要实现这一点,只需通过子类化QWidget,并且通过重新实现一些用来绘制窗口部件和相应鼠标点击的事件处理器即可
比如继承QWidget类
例如,创建一个可以改变区域颜色的简单图形界面程序
先让主类继承QWidget,在重写需要自己实现的虚函数,如下面的 mousePressEvent , mouseMoveEvent, paintEvent
  1. class IconEditor : public QWidget
  2. {
  3. Q_OBJECT
  4. //声明类的属性
  5. Q_PROPERTY(QColor penColor READ penColor WRITE setPenColor)
  6. Q_PROPERTY(QImage iconImage READ iconImage WRITE setIconImage)
  7. Q_PROPERTY(int zoomFactor READ zoomFactor WRITE setZoomFactor)
  8. public:
  9. explicit IconEditor(QWidget *parent = 0);
  10. ~IconEditor();
  11. void setPenColor(const QColor &newColor);
  12. QColor penColor() const { return curColor; }
  13. void setZoomFactor(int newZoom);
  14. int zoomFactor() const { return zoom; }
  15. void setIconImage(const QImage &newImage);
  16. QImage iconImage() const { return image; }
  17. QSize sizeHint() const;
  18. protected:
  19. void mousePressEvent(QMouseEvent *);
  20. void mouseMoveEvent(QMouseEvent *);
  21. void paintEvent(QPaintEvent *);
  22. private:
  23. void setImagePixel(const QPoint &pos, bool opaque);
  24. QRect pixelRect(int i, int j) const;
  25. QColor curColor;
  26. QImage image;
  27. int zoom;
  28. };

再依次实现类中的函数,与MFC中自绘控件是一回事。以下是cpp中部分代码
  1. void IconEditor::paintEvent(QPaintEvent *event){
  2. QPainter painter(this);
  3. if(zoom>=3){
  4. painter.setPen(palette().foreground().color());
  5. for(int i=0; i<=image.width(); i++){
  6. painter.drawLine(zoom*i, 0,
  7. zoom*i, zoom*image.height());
  8. for(int j=0; j<=image.height(); j++){
  9. painter.drawLine(0, zoom*j,
  10. zoom*image.width(), zoom*j);
  11. }
  12. for(int i=0; i<image.width(); i++){
  13. for(int j=0; j<image.height(); j++){
  14. QRect rect = pixelRect(i, j);
  15. if(!event->region().intersected(rect).isEmpty()){
  16. QColor color = QColor::fromRgba(image.pixel(i, j));
  17. if(color.alpha()<255)
  18. painter.fillRect(rect, Qt::white);
  19. painter.fillRect(rect, color);
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  1. void IconEditor::mousePressEvent(QMouseEvent *event){
  2. if(event->button() == Qt::LeftButton){
  3. setImagePixel(event->pos(), true);
  4. } else if(event->button()==Qt::RightButton){
  5. setImagePixel(event->pos(), false);
  6. }
  7. }
  8. void IconEditor::mouseMoveEvent(QMouseEvent *event){
  9. if(event->buttons() & Qt::LeftButton){
  10. setImagePixel(event->pos(), true);
  11. } else if(event->buttons() & Qt::RightButton){
  12. setImagePixel(event->pos(), false);
  13. }
  14. }




程序运行截图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/115036
推荐阅读
相关标签
  

闽ICP备14008679号