QT 6.4无法完整显示4K图像问题求助
4K图像仅顶部1/6区域显示,1080p正常的问题排查与解决
使用QT 6.4版本,通过PCIE接收数据存入内存后进行显示时,3840x2160的4K图像仅顶部1/6区域有画面,下方无图像,但1080p数据可正常显示。已尝试修改UI与QImage的分辨率,问题仍未解决。
相关代码
newWindow::newWindow(QWidget *parent) : QWidget(parent), ui(new Ui::newWindow) { ui->setupUi(this); pcie_c2h_event0.isplay = false; connect(&pcie_c2h_event0, SIGNAL(sig_inform_disp()), this, SLOT(disp_slot())); connect(&pcie_c2h_event0, SIGNAL(finished()), this, SLOT(slotThreadFinish())); m_Qimage = new QImage(c2h_align_mem_tmp,3840,2160,QImage::Format_RGB32); if(!pcie_c2h_event0.isRunning()) pcie_c2h_event0.start(); } newWindow::~newWindow() { pcie_c2h_event0.isplay = false; while (pcie_c2h_event0.isRunning()); pcie_close(); delete ui; } void newWindow::disp_slot() { QPixmap m_Qpixmap; if(pcie_c2h_event0.isplay == false) return; ui->label->setAutoFillBackground(true); read_pack((char*)c2h_align_mem_tmp,3840*2160*4,0); m_Qpixmap = QPixmap::fromImage(*m_Qimage,Qt::AutoColor); ui->label->setPixmap(m_Qpixmap); }
问题原因分析
- 语法错误导致分辨率参数失效:代码中QImage构造时使用了中文逗号分隔3840和2160,编译器解析会出错,实际传入的高度参数异常,QImage有效高度远小于2160,因此仅显示顶部区域。
- 行字节对齐不匹配:如果PCIE传输的每行数据有硬件要求的对齐字节,而QImage默认按
宽度*像素字节数计算行跨度,会导致行数据偏移、画面错位。1080p的行字节数可能刚好符合默认计算,因此显示正常。 - 数据读取不完整:
read_pack函数可能未读取到完整的4K图像数据,实际读取量不足导致下方无像素数据。
解决步骤
- 修复语法错误:将QImage构造中的中文逗号替换为英文逗号,确保分辨率参数正确传递:
m_Qimage = new QImage(c2h_align_mem_tmp, 3840, 2160, QImage::Format_RGB32); - 明确指定行字节跨度:如果PCIE传输的每行数据有对齐要求,手动传入正确的行字节数:
// 假设RGB32格式下,每行实际字节数为3840*4(若有对齐则替换为实际值) int bytesPerLine = 3840 * sizeof(uint32_t); m_Qimage = new QImage(c2h_align_mem_tmp, 3840, 2160, bytesPerLine, QImage::Format_RGB32); - 验证数据读取完整性:检查
read_pack的实际读取字节数,确保读取了完整的4K图像数据:int actualRead = read_pack((char*)c2h_align_mem_tmp, 3840*2160*4, 0); qDebug() << "实际读取字节数:" << actualRead; - 优化UI显示适配:设置QLabel自适应图像大小,避免因标签尺寸不足导致显示不全:
ui->label->setScaledContents(true);
内容的提问来源于stack exchange,提问作者yimengxiaoyao
相关产品推荐
相关产品推荐

