qt视频渲染画面闪烁

问题:
用第三方库给qt窗口渲染时候,当移动窗口更改大小时候,画面出现闪烁现象。

原因:
widget属性updatesEnabled默认是true,这个时候按照qt文档说法就是
An updates enabled widget receives paint events and has a system background
这个widget会有默认的背景以及接受paintevent事件,我的linux下默认背景是白色,这样,在改变大小时候,widget先刷新背景(颜色或是图片)然后接受窗口系统绘制事件刷新前景(也就是第三方库绘制在窗口上的东西),这样就造成了闪烁现象。

解决办法:
setUpdatesEnabled(false).
设置false之后,widget就不会刷新背景,同时也不会接受paintevent事件了。

补充一点:qt文档也说了:
Disabling a widget implicitly disables all its children. Enabling a widget enables all child widgets except top-level widgets or those that have been explicitly disabled. Re-enabling updates implicitly calls update() on the widget
大概意思我理解的是:如果将父窗口disbale了,那么字窗口的背景也都不会刷新,如果只是想让某一个widget不刷新背景,那么单独disbale那个窗口就行。(暂时没有去试验,但是理论应该成立)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 QT 中显示视频监控画面,可以使用 OpenCV 库来实现。以下是一些基本步骤: 1. 安装 OpenCV 库并将其添加到 QT 项目中。 2. 在 QT 界面中添加一个 QLabel 控件,用于显示视频画面。 3. 使用 OpenCV 的 VideoCapture 类打开摄像头并捕获视频帧。 4. 将捕获到的视频帧转换为 QT 的 QImage 类型。 5. 将 QImage 显示在 QLabel 控件中。 以下是一个简单的示例代码: ```c++ #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp> // 定义一个 QTimer 对象,用于定时更新视频画面 QTimer *timer; // 定义一个 QLabel 控件,用于显示视频画面 QLabel *label; // 定义一个 VideoCapture 对象,用于捕获视频帧 cv::VideoCapture cap; // 定义一个 Mat 对象,用于存储视频帧 cv::Mat frame; // 定义一个函数,用于将 OpenCV 的 Mat 类型转换为 QT 的 QImage 类型 QImage mat2qimage(const cv::Mat &mat) { QImage image(mat.cols, mat.rows, QImage::Format_RGB888); for (int y = 0; y < mat.rows; ++y) { const uchar *ptr = mat.ptr<uchar>(y); for (int x = 0; x < mat.cols; ++x) { image.setPixel(x, y, qRgb(ptr[2], ptr[1], ptr[0])); ptr += 3; } } return image; } int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个 QLabel 控件,并设置其大小和位置 label = new QLabel(); label->setFixedSize(640, 480); label->move(100, 100); // 打开摄像头并捕获视频帧 cap.open(0); if (!cap.isOpened()) { qDebug() << "Failed to open camera"; return -1; } // 创建一个 QTimer 对象,并设置其定时器间隔为 30 毫秒 timer = new QTimer(); timer->setInterval(30); // 连接 QTimer 的 timeout 信号到槽函数,用于更新视频画面 QObject::connect(timer, &QTimer::timeout, [&]() { cap >> frame; // 捕获视频帧 if (!frame.empty()) { QImage image = mat2qimage(frame); // 将 Mat 类型转换为 QImage 类型 label->setPixmap(QPixmap::fromImage(image)); // 显示在 QLabel 控件中 } }); // 启动定时器 timer->start(); // 显示 QT 界面 label->show(); app.exec(); return 0; } ``` 注意:上述代码仅供参考,实际应用中还需要处理一些异常情况,例如打开摄像头失败等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值