1.本想着当一个控件resizeEvent触发时将控件里的一切坐标都设置好,后来发现是我太天真了。事实就是第一次resizeEvent触发根本获取不到子控件的任何参数(坐标和大小),目前像这种自定义控件最好在showEvent中将一切设置好。
今天showevent中QTableWidget大小获取错误不知道为什么
2.写圆形的这种控件要求直径必须是个圆 这就要求长和宽要是偶数 且两个都取最小的那个数值
3.这个是c++问题 考虑编译的问题 不要在还没有声明 类的情况下 就调用 同一个文件中 类的声明顺序要注意
4.为了重写qpaintevent我写了一个类继承自QLabel 但是显示不出来 发现调用它的构造函数时 未正确传值给父类
然后就造成了基类调用QLabel的默认构造且父窗口是null 但是子类父窗口却使用了自己设置的窗口,造成了矛盾
但是我猜测内部还是以父类里的参数作为父窗口的
5 2019.7.5:自己写了个类继承了QLabel重写了其中的QPainterEvent 然后setText(xx)死活显示不出来了
思考了一下结论:QLabel的SetText本身就是通过他自身的QPainterEvent实现了 重写了这个所以没有了这个功能。
6 2019 7.11 qpainter not active Painter无效 图画不出来 检查了一下 之前QPainter painter(this); 没有参数 日了狗
7QWidget设置为模态窗口 网上人讲的都不到位,多一句,少一句的,在widget构造函数里加
//模态
setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
setWindowModality(Qt::WindowModal);
即可 重点是上面那句
8 2019.9.6 设置矩形参数 先设置点再设置长和宽 不然不正确
QRect rect;
rect.setX(10);
rect.setY(10);
rect.setWidth(150);
rect.setHeight(150);
9.QDialog或者继承自QDialog的窗口设置父类就不模态了
10.2020.3.25 仔细考虑过为了灵活运动 依然需要将该设置的参数全部设固定值再update 而不是一味的将接口做简单全部通过程序内部判断
11.有的时候我们需要不让控件发出信号,我们可以用如下函数:
//这里不要让其发出textchange信号
ui->edit_average_pre->blockSignals(true);
ui->edit_average_pre->setText(QString::number(value));
ui->edit_average_pre->blockSignals(false);
12.为了适应高dpi 首先需要使用QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); 其次图片全部用SVG格式,最后如果出现图片不符合需要自己再用函数painter处理下
class CCustomIconEngine : public QIconEngine
{
QSvgRenderer* svgRender;
QPixmap iconPix;
public:
explicit CCustomIconEngine(QString svgPath, QSize sz) {
svgRender = new QSvgRenderer(svgPath);
}
~CCustomIconEngine() {
delete svgRender;
}
void paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state)
{
QSize pixmapSize = rect.size();
int imgWidth = rect.width() / g_fGlobalDPI;
int imgHeight = rect.height() / g_fGlobalDPI;
QImage image(imgWidth, imgHeight, QImage::Format_ARGB32);
QPainter _painter(&image);
image.fill(BFGetIconBackColor());
svgRender->render(&_painter);
iconPix = QPixmap::fromImage(image);
painter->setBrush(BFGetIconBackColor());
QRect rcPixmap = rect.adjusted(-1, -1, 0, 0);
painter->drawRect(rcPixmap);
//painter->setPen(QColor("#1B90FB"));
//painter->drawLine(rect.bottomLeft(), rect.bottomRight());
painter->drawPixmap(QRect((rcPixmap.width() - imgWidth) / 2, (rcPixmap.height() - imgHeight) / 2, imgWidth, imgHeight), iconPix);
}
QIconEngine *clone() const {
return new CCustomIconEngine(*this);
}
};