Qt的adjectSize()和update()

一、adjectSize();

更新字体,调用adjectSize()的同时,会通过SizeHint()来确定组件的大小

例如:

QSize CharacterWidget::sizeHint() const
//也就是说一个 widget 该有多大,它的一个参考来源就是这个sizeHint 属性的值,而这个值由 sizeHint() 函数来确定。
{
//    qDebug()<<"调用sizeHint()"<<'\n';
    //65536
    return QSize(columns*squareSize, (65536/columns)*squareSize);

    /*
     * QSize::QSize(int width, int height)
     * Constructs a size with the given width and height.
     * 表示显示组件的大小,宽和长;
     */
}

二、update();

update()的主要作用在于可以调用update()的同时,系统会去调用paintEvent()函数来更新整体组件

如下:

void CharacterWidget::paintEvent(QPaintEvent *event)
{
//  qDebug()<<"调用paintEvent"<<'\n';
    QPainter painter(this);
    painter.fillRect(event->rect(), QBrush(Qt::white));
    painter.setFont(displayFont);
//! [6]

//! [7]
    QRect redrawRect = event->rect();
    int beginRow = redrawRect.top()/squareSize;//表示起始的表格行数beginRow
    int endRow = redrawRect.bottom()/squareSize;//表示终止的表格行数为endRow
    int beginColumn = redrawRect.left()/squareSize;//表示起始的表格列数为beginColumn
    int endColumn = redrawRect.right()/squareSize;//表示终止的表格列数为endColumn
    //
 //   qDebug()<<redrawRect<< beginRow<<" "<< endRow<<" "<<beginColumn <<" "<< endColumn<<'\n';
    //
//! [7]

//! [8]
    painter.setPen(QPen(Qt::gray));//将表格线的颜色设为褐色
    for (int row = beginRow; row <= endRow; ++row) {
        for (int column = beginColumn; column <= endColumn; ++column) {
            painter.drawRect(column*squareSize, row*squareSize, squareSize, squareSize);
        }
//! [8] //! [9]
    }
//! [9]

//! [10]
    QFontMetrics fontMetrics(displayFont);
    /*
     *QFontMetrics functions calculate the size of characters and strings for a given font.
     *  即计算了字体大小
     *
     */
//    qDebug()<<fontMetrics<<'\n';无法直接输出
    painter.setPen(QPen(Qt::black));//表示设置字体为黑色,因为painter机制为状态机机制
    for (int row = beginRow; row <= endRow; ++row) {
        for (int column = beginColumn; column <= endColumn; ++column) {

            int key = row*columns + column;//计算出键值
            painter.setClipRect(column*squareSize, row*squareSize, squareSize, squareSize);
            /*
             *  void QPainter::setClipRect(int x, int y, int width, int height, Qt::ClipOperation operation = Qt::ReplaceClip)
             *  Enables clipping, and sets the clip region to the rectangle beginning at (x, y) with the given width and height.
             * 官方文档解释为:
             * We do not need to take into account the difference between the area displayed in the viewport and the area we are drawing on
             * because everything outside the visible area will be clipped.
             *  在QPainter()中通过QPainter::setClipRect设定一个区域,我们绘图则只能在这个区域,此区域外绘图都是无效的。
             * 暂时不理解
             * ??????
             */
            if (key == lastKey)
                painter.fillRect(column*squareSize + 1, row*squareSize + 1, squareSize, squareSize, QBrush(Qt::red));
            /*
             *void QPainter::fillRect(int x, int y, int width, int height, const QBrush &brush)
             *  Fills the rectangle beginning at (x, y) with the given width and height, using the given brush.
             */
            painter.drawText(column*squareSize + (squareSize / 2) - fontMetrics.width(QChar(key))/2,
                            row*squareSize + 4 + fontMetrics.ascent(),
                           QString(QChar(key)));
            /*
             * Draws the given text at position (x, y), using the painter's currently defined text direction.
             * 该函数用于在表格中绘制字符
             */
        }
    }
}
不仅如此:

paintEvent()

A paint event is a request to repaint all or part of a widget. It can happen for one of the following reasons:

  • repaint() or update() was invoked,
  • the widget was obscured and has now been uncovered, or
  • many other reasons.

表示

(1)、当我们调用了repaint()和update()函数

(2)表示组件被销毁并且现在没有被覆盖(没太懂)

(3)其他原因


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值