QT显示图片
时间:2010-03-16 来源:landuochong
从该网站收集的所有有用的帖子/
//////////////////
希望有人做过
//////////
qt 下显示内存里的图像数据
请教大家一个问题:
我现在有一Buffer里存放了16bit 的图像数据,我想让它在QT程序里显示出来该怎么办呢?
在之前我用Qimage 类构造一个image图,但显示出来的图像颜色不对。实现的过程如下 :
Buffer:存放了图像数据
QImage image = new QImage(Buffer,Width,Height,16,0,1,QImage::IgnoreEndian);
QPainter p(this);
p.begin(this);
p.drawImage(0,0,*image);
p.end();
请大家给点建议,有没有更好的方法去实现?
///////////////////
求教QT下显示视频的方法(急用啊~~)
各位大虾:
我现在想做QT下显示经过网络传输过来的BMP图片的界面,是否可以用QImage 这个类来实现呢?
如果可以的话应该怎样做呢?(我看过QImage 这个类好像很多东西啊,应该不用全部都用上吧!)
如果QImage 这个类不能实现的话,那应该怎样实现呢?希望得到各位的帮助,先谢谢了!!
用QLabel可查看图像,由QImage或者QPixmap创建
QPixmap img;
img.loadFromData();//在参数中加载图像数据
然后
QLabel::setPixmap(img);
/////////////////
我做了一个简单的尝试:
HWWidget::HWWidget(QWidget * parent, const char *name, WFlags f)
: QWidget( parent, name, f)
{
left = 0;
top = 160;
width =240;
height = 160;
mPixmap = QPixmap("./bicycle.jpg");
//setBackground(Noground);
show();
}
void HWWidget::paintEvent(QPaintEvent * /*e*/)
{
QPainter p( this);
static int times = 1;
static int yoffset = 8;
{
setGeometry( 0, 320-times*yoffset, 240,times*yoffset);
p.drawPixmap(0, 0, mPixmap, 0, 0, -1, -1);
times++;
usleep(500000);
}
}
这样的效果能出来一点,就是图片bicycle.jpg能动画的划出来,存在三个问题:
1.是个死循环,可能是因为setGeometry也会引发paint...
2.只有bicycle.jpg图便能有动画效果,但是widget看不到他的默认的frame...
3.可能运算太多,arm处理器不能很好的支持
所以,请问,QT有没有好一点的接口,支持整个widget也一起想抽屉一样的划出来,
类似与QQ的主界面,从隐藏状态显示出来的时候,是一个划出来的效果..可以从左到右,从上到下,甚至从下到上的划出来...???
非常感谢您的帮助!!!!
///////////////////
图片显示出现的错误,帮忙分析一下阿
下面的程序只显示了一下,就没了。而且没显示图片,请打下帮忙分析一下,不胜感激!
//while(1)
{
buffer=v4lsyn(dev1,i);
repaint();
v4lcapture(dev1);
}
void imageprocess::paintEvent( QPaintEvent * )
{
paint=new QPainter(this);
paint->begin(this);
label = new QLabel(this);
QImage *img=new QImage((unsigned char*)buffer,640,480,8,0,1,QImage::IgnoreEndian);
QPixmap tmp;
tmp=*img;
label->setPixmap(tmp);
fprintf (stderr, "readjusting width to %d\n", *buffer);
paint->end();
}
下面是调试时显示的错误:
QPainter::begin: Painter is already active.
You must end() the painter before a second begin()
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1084981632 (LWP 6669)]
0x0804d70b in imageprocess::paintEvent(QPaintEvent*) (this=0xbfffe540)
at imageprocess.cpp:243
243 fprintf (stderr, "readjusting width to %d\n", *buffer
如果把while 前的//去掉,就完全打不开界面,本人很是疑惑,这个问题也帮忙分一下,
label->setPixmap(tmp);
应该是paint->drawImage(5,5,img)
刚才发错了
paint =new QPainter(this);
定义是在paintEvent外了,
你将paint定义移到paintEvent函数内部
///////////////////////
请问关于QImage Class 的问题
各位大虾:
我现在想做QT下显示经过网络传输过来的BMP图片的界面,是否可以用QImage 这个类来实现呢?
如果可以的话应该怎样做呢?(我看过QImage 这个类好像很多东西啊,应该不用全部都用上吧!)
如果QImage 这个类不能实现的话,那应该怎样实现呢?希望得到各位的帮助,先谢谢了!!
loadFromData()来加载图像,并通过QLabel来显示
/
///////////////////
关于摄像头捕捉图像2
我做的不知道是不是和obrire的一样,但我想摄像头数据截取不分应该是差不多的,
源代码我是不能说的,因为像obrire说的涉及到商业.
基本流程是这样的:先调用系统函数open(dev,O_RDWR);然后开辟共享内存adrr=mmap();adrr是内存首地址;
再调用ioctl (dev, VIDIOCMCAPTURE, &vid_mmap);ioctl (dev, VIDIOCSYNC, &vid_mmap.frame);得到图像;
然后再操作adrr就行了;
注意:没用每用完一次mmap()要记得把他销毁munmap(adrr, size);不然它会从新开辟另一块内存.直到系统内存
被用完.
显示的时候建议先把图像数据拷贝到自己开辟的内存里再对数据进行处理,显示\压缩什么的随你;
显示我的思想方法是,先创建一个Image;然后把数据放到Image里;最后painter出来;
skyly2222,你能不能把最后一步image(),这个参数,我设置不好..,显示效果烂的很..
我只需要几行代码,就是qt部分,其他部分,我已经做完了。
你能用的是
QImage ( uchar * yourdata, int w, int h, int depth, QRgb * colortable, int numColors, Endian bitOrder );
这个函数吧?
这个函数我试过,不行,因为colortable设置不好会倒置象素放大或缩小造成图像混乱;
我是这样解决的.
QRgb rgb;
QPainter *paint=new QPainter;
i=0;
if(bm.create(width,height,32,0,QImage::IgnoreEndian))
{ for (x = 0; x < height ; x++) {
for (y = 0; y <width; y++) {
r=(int)bit[i+2];
g=(int)bit[i+1];
b=(int)bit;
uint *pp = (uint *)bm.scanLine(x) + y;
*pp = qRgb(r,g,b);
i=i+3;
}
}
}
我想请教skly22222,我按照上面步骤写了一个数据采集程序,在QT程序中把它作为 .c文件在工程编译的时候出了问题,原因好像是这部分关于linux下的头文件找不到,但把这个程序作为.h文件时就没有这种问题了,想知道这部分程序是否可以作为.h文件调用,另外我上面问题怎么解决。路过的各位大侠也请不吝赐教,谢谢!!
skly22222,多谢了,我在用图像处理作毕业设计,也是刚用QT,你的这些代码很有用,QT资料太少了,尤其在图像处理这一方面,有没有好的网站或资料介绍一下,让我们少走些弯路!
////////////////////
还是摄像头问题,能显示但没标题栏,无法控制它
部分源码用的如下
paint=new QPainter(this);
paint->begin(this);
v4l_open("/dev/video0",&device);
unsigned char *data = GrabData();
int x,y;
int i=0;
QImage img;
QRgb *point;
int r,g,b;
if(img.create(480,320,32,0,QImage::IgnoreEndian))
{
for(x=0;x<320;x++)
{
for(y=0;y<480;y++)
{
r=(int)data[i+2];
g=(int)data[i+1];
b=(int)data;
point = (QRgb *) img.scanLine(x)+y;
*point = qRgb(r,g,b);
i+=3;
}
}
}
paint->drawImage(10,10,img);
我现在根据上面给出的摄像头的一段程序,自己把它写全,已能在板子上显示了,但是那个图像没含最大化、最小化、关闭按钮的标题栏,请问能把它画在label或是其他qt的类上吗?怎么画呢,我还想加一个按钮来关闭端口。谢谢!
创建个widget。把这段代码写在它的paintEvent里应该就可以了吧
楼主我想请教一下,我按照上面类似的做法,图像不能刷屏,只能显示最初采集的一帧,时什么原因。
因为paintEvent只有在widget接到paint事件的时候才会调用。 你不动它是不会调到paintEvent的
还是加个timer或者在需要刷新的时候调用repaint才行
////////////////
[备份]实现从RGBA32格式的内存数据中初始化一个QImage[lsosa.BIT]
很多人都为如何将内存中某一个格式的数据如何转换成为图片数据显示到屏幕上犯愁,因为这是实现处理视频的一个关键部分,我曾经也是,所以深知其不容易,如今,我这里问题已经解决,所以将解决方法备份与此,仅供参考。
这里提供处理两种数据格式的方法,一种是处理RGB24格式,另一种是RGBA32格式;
说明:
内存中数据保存在pv_frame指针指向的内存空间中;
图象宽度为v_width, the height of it is v_height;(高度是v_height);下面展示方法调用;
RGB24:
/**
* lsosa.BIT
*/
int i;
int r, g, b;
QRgb *point;
uchar *bit;
QImage *pVideoImage = new QImage(width, height, 32);
setWFlags(getWFlags() | Qt::WRepaintNoErase);
// these codes should be optimized in future;
// high cpu taked here;
i = 0;
bit = (uchar *)(_frame);
for(int y = 0; y < v_height; y ++){
for ( int x = 0; x < v_width; x ++ ){
r = (int)bit;
g = (int)bit[i+1];
b = (int)bit[i+2];
point = (QRgb *)pVideoImage->scanLine(y) + x;
*point = qRgb(r, g, b);
i += 3;
}
}
bitBlt(this, 0, 0, pVideoImage);
the details is here:
http://www.qtcn.org/bbs/read.php?tid=3648&page=e&fpage=5
http://www.qtcn.org/bbs/read.php?tid=4990&page=e&fpage=1
RGBA32:
/**
* lsosa.BIT
*/
QImage *pv_image;
if ( pv_image == NULL ){
QImage pv_image = new QImage((uchar *)pv_frame, \
v_width, v_height, 32, NULL, 0, QImage::LittleEndian);
if ( pv_image == NULL ){
return -1;
}
}
all is this...
这里在补充一种方法,你可以使用QImage 的loadFromData方法从一段内存数据中加载图像,例如:
QImage *pf_video_image = new QImage();
pf_video_image->loadFromData(pf_videobuffer, frame_size);
如此应该也可以的;
代码是凭感觉写出来的,为经过测试哦。。。
//////////////////////////
关于摄像头视频捕捉
各位大大:
小弟做了一个摄相头视频捕捉程序,想连续从摄相头来的数据..现在的思路是将摄相头的数据用timer定时读到自己开辟的内存空间中,然后通过image.loadfromdata读出来,然后设置为label背景,label->setPixmap(),但是怎么也显示不出来,我想问问是不是这个思路,和具体的应该用什么控件,和api,请高手指点.....急啊..
共享内存会更快些immap
真是的,LCD驱动有三层,Overlay 1/Overlay 2和FameBuffer
为什么一定要用QT, 就相当于DShow一样,在不同层显示不同应用.还可以支持透明.
我们可以将QT的应用放在FameBuffer(Base Layer)上,而VideoCap的实时内容放
在Overlay2上,这叫回放.而在VideoCap上显示的文字,图标放在Overlay1上呀.
以上三层,包括通道透明处理和灰度处理,都测试通过.
以上便用是商业开发的真正实现.望对诸位有益.
不仅仅是LCD,所有的FameBuffer驱动,都应当支持这三层.
其实Windows也是这样实现的.
VideoCAP就是V4L提供的Linux下的用于电视(数字/模拟)的接收,存储,发布和PVR/DVR应用内核支持组件.
一般来讲,CCD/CMOS的摄像头也是使用此类接口.电视卡一般采用模拟接入,也可以像Windows下进行数据
采集的.
如果你对系统不了解,只知道库,控件什么的,这比较麻烦.
这需要对整个流程非常熟,以及对RGB/YUV的转换非常了解,才能完成实时视频流捕获/压缩和后处理.
很失望的是,这方面没有现成的控件.如果有,也只能使用驱动直接提供的接口.
至于上面有朋友提到什么timer/mmap,这只是在ioctl时,采用的一种技术.一般采用mmap,但这只能
将数据读出来,但你要知道读出来的是什么颜色,什么格式的数据呀?YUV 4:4:2/RGB 8:8:8?还是其它格式?
各种制式还要适合你的显示设备的制式,你的VGA支持哪种格式?一般是YUV 4:2:2.如果你的LCD/VGA等不
持,显示不出来.如果支持相同格式,按byte读出buffer,直接写入或cat到framebuffer上就可以显示出来了.
至于实时的preview,就是Overlay所支持的回放.打开相应的Overlay层,一个while循环就可了了.
以上便是智能设备视频开发流程的全部.
尽管我有全部的代码,但有可能涉及到商业代码,恕不能提供更多技术支持.
所能支持层:目前有一个家公司提供的产品中,能支持mjpeg/3gp播放,但不能实时codec,而以前我们所工作的
平台,能完全实时3gp实时压缩/RTP发布,支持DivX/Xvid.能让mplayer工作于arm平台,很流畅的进行播放.
首先,能对你提供帮助的是,这与QT没有任何关系.
QT只工作于fb0所支持的Base层.这是三层概念.
Base Layer fb0-->就是你的Qtopia可以显示的平面
Overlay 2 -->就是你要看到效果的平面,用于VideoCapture来的数据流实时显示
Overlay 1 -->就是你的数码相机/手机/PDA上,拍摄时,上面显示的按键/调节提示/文字/时间等
至于QTE,它只负责将GUI数据显示于第一层的内存空间
而Overlay 2是你的显示模块能支持最大的全屏图像数据大小的内存空间
Overlay 1是另一片内存区,比Overlay 2要小,主要用于存储最上层的一此提示数据/图像显示
这三层的实时,与嵌入式与否无关.
如还不清楚,建议你看看Intel中IPP关于图像/视频这部分的内容.
这比较麻烦,我只能帮你到这儿.之所以不清楚,是你对这个流程并不清楚.
就是你将数据读出来了,写到你的QT Label内存区间,是不一定显示正常的.这此数据只是颜色数据
这显相于直接写屏呀.不会引起显示的混乱??
/////////////////
加载图片的问题
////////////////////////////////////
renderarea.h
///////////////////////////////////
#include <QWidget.h>
#include <QPainter.h>
#include <QPen.h>
#include <QPixmap.h>
class renderarea:public QWidget
{
public:
renderarea(QWidget *parent=0);
void paintEvent(QPaintEvent *event);
private:
QPen pen;
QPixmap pixmap;
};
////////////////////////////////
renderarea.cpp
///////////////////////////////
#include "renderarea.h"
renderarea::renderarea(QWidget *parent):QWidget(parent)
{
}
void renderarea::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(pen);
painter.drawLine(10,10,60,70);
pixmap.load(":/images/dog.png");
painter.drawPixmap(0,0,pixmap);
}
////////////////////////////////
main.cpp
///////////////////////////////
#include <QApplication.h>
#include "renderarea.h"
int main(int argc,char *argv[])
{
QApplication qapp(argc,argv);
renderarea background;
background.show();
return qapp.exec();
}
//////////////////////////////////
做一个小程序需要加载图片,所以就弄了这个小东西试验一下,编译都通过了
画矩形,画直线都没有问题,但是图片画不出来,不知道原因是什么,看了几个例子都是这么
弄的,不明白为什么到我这就不行了?欢迎大家提出宝贵意见
由于版权原因, Qt对GIF格式支持并不好.
改换个jpg格式的就行了....
经过我逐行检查,发现是图片并没有load成功,希望大家给我分析一下原因
pixmap.load(":/images/dog.png");
//路径问题.你试试用绝对路径
问题解决了,我的是qt4 windows版的,后来我把图片写到qrc文件中,就ok了,谢谢你的帮忙
////////////////
一个图片显示的小程序求教
想写一个简单的在qt下显示图片的程序
可是在编译时老出现这个错误:error: multiple types in one declaration 一个声明指定了多个类型
比如在生成image.o的时候 /usr/lib/qt-3.3/include/qpen.h:88: 错误:一个声明指定了多个类型
在编译main.cpp的时候也有这种情况
/usr/lib/qt-3.3/include/qdesktopwidget.h:43: error: multiple types in one declaration
不知道是自己程序哪个地方出毛病了,反正把image.cpp置空就没这个错误了
多谢
程序如下:
imag.h
Copy code
#ifndef IMAGE_H
#define IMAGE_H
#include <qwidget.h>
#include <qimage.h>
class MyImage : public QWidget
{
public:
MyImage( QWidget *parent=0, const char *name=0, int wFlags=0 );
~MyImage();
bool loadImage( const QString& );
protected:
void paintEvent( QPaintEvent * );
private:
QString filename;
QImage image;
}
#endif
image.cpp
Copy code
#include "image.h"
#include <qpainter.h>
#include <qapplication.h>
#include <qmessagebox.h>
MyImage::MyImage( QWidget *parent, const char *name, int wFlags ):QWidget( parent, name, wFlags )
{
bool ok;
filename = "/opt/program/qt/showimg/save";
ok = loadImage( filename );
printf( "ok = %d \n", ok );
}
MyImage::~MyImage()
{
}
bool MyImage::loadImage( const QString& filename )
{
bool ok;
ok = image.load( filename, 0 );
update();
return ok;
}
void MyImage::paintEvent( QPaintEvent *e )
{
QPainter painter(this);
painter.setClipRect(e->rect());
painter.drawImage( image.width(), image.height(), image );
}
main.cpp
Copy code
#include "image.h"
#include <qapplication.h>
#include <qimage.h>
int main( int argc, char **argv )
{
QApplication a( argc, argv );
MyImage myimage;
a.setMainWidget( &myimage );
myimage.setCaption("image Example");
myimage.show();
return a.exec();
}
大哥。你是我的偶像.
class X
{
//....
}; 这里的';'可不能掉啊,加上就OK了
QT examples showing
这是一个图片显示的例子
QT 2.3.7 QTabel 加载图片的问题 请支招!!!
QT 2.3.7 form1.cpp中,
QPixmap pixmap1( "/root/pic/tabel.png");
table1 = new QTable( this, "table1" );
table1->setGeometry( QRect( 135, 38, 181, 127 ) );
table1->setBackgroundPixmap(pixmap1);
在form1.h中,table1有申明.
问题一: 为什么设置后,显示不出来图片pixmap1,也就是setBackgroundPixmap好像不起作用.
问题二: 在QT3.1.7下,tabel有setReadOnly属性设置单元格是否只读,可是在QT2.3.7下,找不到只读属性.
如何才能显示图片以及设置单元格的只读属性呐?
急盼支招! 谢谢!
///////////////////
QPixmap::loadFromData 里面的 QByteArray & data 是个什么东西呢
bool QPixmap::loadFromData ( const QByteArray & data, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor )
我在Qt程序里读入了一个Qt不支持的图片,pics格式。现在已经可以用程序读入内存。用QImage的setPixel 的时候,读入图片的速度比较慢。所以在寻求其他的方法。
看到前面大家讨论说可以直接读buffer, 我想这个方法可能可以吧。
所以想问问这个QByteArray & data是什么呢,该怎么用阿。
/////////////////////////////
请问一下,我在linux下用QT3写的一个界面的显示,出现闪屏的问题
我在linux下用QT3写的一个界面的显示,在LCD上显示时出现严重的闪屏现象,因为数据和图形要实时更新,现在想不出什么好的办法来解决,因为我也是初次接触QT。有同学跟我说用什么双缓冲可能可以,但是我还不太明白要用到哪些函数,,请高手指点一下,或可以提供些相关的资料,谢谢了
双缓冲并不需要什么特别的函数,原理就是把图画好后再放在屏幕上显示.
void QProgressBar::drawContents( QPainter *p )
{
const QRect bar = contentsRect();
QPixmap pm( bar.size() );
QPainter paint( &pm );
const QPixmap * bgPixmap = backgroundPixmap();
QBrush fbrush = ( bgPixmap ? QBrush( backgroundColor(), *bgPixmap ) :
QBrush( backgroundColor() ) );
if ( bgPixmap && !isTopLevel() && (backgroundOrigin() != WidgetOrigin) )
paint.setBrushOrigin( -x(), -y() );
paint.fillRect( bar, fbrush );
paint.setFont( p->font() );
QStyle::SFlags flags = QStyle::Style_Default;
if (isEnabled())
flags |= QStyle::Style_Enabled;
if (hasFocus())
flags |= QStyle::Style_HasFocus;
style().drawControl(QStyle::CE_ProgressBarGroove, &paint, this,
QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarGroove, this), this ),
colorGroup(), flags);
style().drawControl(QStyle::CE_ProgressBarContents, &paint, this,
QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarContents, this), this ),
colorGroup(), flags);
if (percentageVisible())
style().drawControl(QStyle::CE_ProgressBarLabel, &paint, this,
QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarLabel, this), this ),
colorGroup(), flags);
paint.end();
p->drawPixmap( bar.x(), bar.y(), pm );
}
////////////////////
【提问】实时视频采集在多线程编程中实现的问题?
我使用QT designer作了一个程序,程序要求可以视频实时采集,我用一个窗口来显示摄像头捕捉的视频,我可以使用QThread类来实现这个视频采集,可是视频显示的程序是一个无限循环,这样Qt 的GUI 主事件线程就会一直在等待视频采集的结束
,这样我的主界面mainform就不能运行了,主界面上的各个控件就会无响应。
如何才能让这个视频采集程序在后台运行,并在主程序里控制视频采集程序的开始和暂停?
请各位大侠帮忙!!!!
你看看这个程序看能否有帮助 ,我以前好像也遇到过这样的情况 ,不过比你的简单
////////////////////////////////////////////////////////
#include <qapplication.h>
#include <qhbox.h>
#include <qthread.h>
#include <qlabel.h>
class WaitThread: public QThread
{
public:
WaitThread(QThread *thr1, QThread *thr2, QLabel *lbl);
void run();
private:
QThread *thread1, *thread2;
QLabel *label;
};
WaitThread::WaitThread(QThread *thr1, QThread *thr2, QLabel *lbl)
: thread1(thr1), thread2(thr2), label(lbl)
{
}
void WaitThread::run()
{
thread1->wait();
thread2->wait();
qApp->lock();
label->setText("<h1>Done!</h1>");
qApp->unlock();
}
class GUIThread : public QThread
{
public:
GUIThread( QLabel*, const QString& );
protected:
void run();
private:
QLabel* label;
QString text;
};
static QMutex* mutex;
GUIThread::GUIThread( QLabel* l, const QString& t )
: label( l ), text( t )
{
}
void GUIThread::run()
{
for ( int i = 0; i < 2; i++ ) {
mutex->lock();
qApp->lock();
label->setText(text);
qApp->unlock();
sleep( 1 );
mutex->unlock();
}
}
// The program starts here
int main( int argc, char** argv )
{
QApplication app( argc, argv );
mutex = new QMutex;
QHBox box( 0, 0, TRUE );
QLabel label( &box );
label.setAlignment(Qt::AlignCenter);
label.setMinimumSize(400, 300);
GUIThread first( &label, "<b>Ping</b>" );
GUIThread second( &label, "<i>Pong</i>" );
WaitThread third(&first, &second, &label);
first.start();
second.start();
app.setMainWidget( &box );
box.show();
third.start();
int r = app.exec();
delete mutex;
return r;
}
我前一段时间做的是一个线程不断的采集数据,然后在一个窗口显示.没有用你说的QWaitCondition::wait .
程序大概如下:
class Mythread::wait : public QThread {
Mythread(Qlabel *label);
public:
virtual void run();
};
MyThread::MyThread(QLabel* l ): label( l)
{
}
void MyThread::run()
{
for( ; ; ) {
sleep( 1 );
label->setText("ping");
qDebug( "Ping!" );
}
}
再参照上面的程序大概就行了
/////////////
【提问】在qt界面设计中怎么显示图像?
我想知道QT中的IconView怎么用?还有要想选择不同的图像让它在界面上显示,应该怎么办呢? 大家给我个思路吧,我的脑子很不明白,下一步怎么走?
谢谢啦:)
在Qt中有QLable类,可以用
void QLabel::setPixmap ( const QPixmap & )
就可以显示图像了
QPixmap *pixmap = new QPixmap(filePath);
QLabel *label;
label->setPixmap(*pixmap);
//////////////////////
【提问】关于在label上显示图片的问题!!【已解决】
我要设计一个能显示图片的界面,还要改变大小、对比度等,但是我在设置button和label的布局之后就不会显示图片了,example里好像没有将图片显示在label上,编译没有问题,但是总是显示
QObject::connect: No such slot Mywindow::loadImage()
QObject::connect: (sender name: 'unnamed')
QObject::connect: (receiver name: 'unnamed')
我用的是QT3.1,loadImage()是仿着一个例子写的,也不知道怎么改。
load有些图片时又显示“浮点数例外”,这个又是什么问题?难道是图片格式不对?
问题已解决了,convertFromImage()实现了,还是谢谢大家了!
我现在也在做显示图片并进行处理的工作,摆放好部件后,在ui.h中编函数时,总是有错误,您能指点一下吗?谢谢
我回答行不行?(每次我好像都是不请自到的)
ui_*.h开头的都是自动生成文件,你要继承这个类,然后在你的新类中使用。
可以参考Qt的示例:C:\Qt\4.1.4\examples\widgets\imageviewer
也可以参考我写的一个小程序
http://www.qtcn.org/bbs/read.php?tid=6546
///////////////
下面是我的程序:
while (1)
{
buffer=v4lsyn(dev1,i);
fprintf (stderr, "readjusting width to %d\n", *buffer);
img=new QImage((unsigned char*)buffer,640,480,8,0,0,QImage::IgnoreEndian);
v4lcapture(dev1);
connect( timer, SIGNAL(timeout()), SLOT(repaint( TRUE )) );
timer->start( 100 );
}
}
void imageprocess::paintEvent( QPaintEvent * )
{
paint->begin(this);
paint->drawImage(0,0,*img);
paint->end();
if( paint->isActive() ){
paint->end();
}
}
我的buffer中有连续的值,但是就是显示不出来,不知道为什么,大虾,帮忙分析一下
//////////////////
希望有人做过
//////////
qt 下显示内存里的图像数据
请教大家一个问题:
我现在有一Buffer里存放了16bit 的图像数据,我想让它在QT程序里显示出来该怎么办呢?
在之前我用Qimage 类构造一个image图,但显示出来的图像颜色不对。实现的过程如下 :
Buffer:存放了图像数据
QImage image = new QImage(Buffer,Width,Height,16,0,1,QImage::IgnoreEndian);
QPainter p(this);
p.begin(this);
p.drawImage(0,0,*image);
p.end();
请大家给点建议,有没有更好的方法去实现?
///////////////////
求教QT下显示视频的方法(急用啊~~)
各位大虾:
我现在想做QT下显示经过网络传输过来的BMP图片的界面,是否可以用QImage 这个类来实现呢?
如果可以的话应该怎样做呢?(我看过QImage 这个类好像很多东西啊,应该不用全部都用上吧!)
如果QImage 这个类不能实现的话,那应该怎样实现呢?希望得到各位的帮助,先谢谢了!!
用QLabel可查看图像,由QImage或者QPixmap创建
QPixmap img;
img.loadFromData();//在参数中加载图像数据
然后
QLabel::setPixmap(img);
/////////////////
我做了一个简单的尝试:
HWWidget::HWWidget(QWidget * parent, const char *name, WFlags f)
: QWidget( parent, name, f)
{
left = 0;
top = 160;
width =240;
height = 160;
mPixmap = QPixmap("./bicycle.jpg");
//setBackground(Noground);
show();
}
void HWWidget::paintEvent(QPaintEvent * /*e*/)
{
QPainter p( this);
static int times = 1;
static int yoffset = 8;
{
setGeometry( 0, 320-times*yoffset, 240,times*yoffset);
p.drawPixmap(0, 0, mPixmap, 0, 0, -1, -1);
times++;
usleep(500000);
}
}
这样的效果能出来一点,就是图片bicycle.jpg能动画的划出来,存在三个问题:
1.是个死循环,可能是因为setGeometry也会引发paint...
2.只有bicycle.jpg图便能有动画效果,但是widget看不到他的默认的frame...
3.可能运算太多,arm处理器不能很好的支持
所以,请问,QT有没有好一点的接口,支持整个widget也一起想抽屉一样的划出来,
类似与QQ的主界面,从隐藏状态显示出来的时候,是一个划出来的效果..可以从左到右,从上到下,甚至从下到上的划出来...???
非常感谢您的帮助!!!!
///////////////////
图片显示出现的错误,帮忙分析一下阿
下面的程序只显示了一下,就没了。而且没显示图片,请打下帮忙分析一下,不胜感激!
//while(1)
{
buffer=v4lsyn(dev1,i);
repaint();
v4lcapture(dev1);
}
void imageprocess::paintEvent( QPaintEvent * )
{
paint=new QPainter(this);
paint->begin(this);
label = new QLabel(this);
QImage *img=new QImage((unsigned char*)buffer,640,480,8,0,1,QImage::IgnoreEndian);
QPixmap tmp;
tmp=*img;
label->setPixmap(tmp);
fprintf (stderr, "readjusting width to %d\n", *buffer);
paint->end();
}
下面是调试时显示的错误:
QPainter::begin: Painter is already active.
You must end() the painter before a second begin()
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1084981632 (LWP 6669)]
0x0804d70b in imageprocess::paintEvent(QPaintEvent*) (this=0xbfffe540)
at imageprocess.cpp:243
243 fprintf (stderr, "readjusting width to %d\n", *buffer
如果把while 前的//去掉,就完全打不开界面,本人很是疑惑,这个问题也帮忙分一下,
label->setPixmap(tmp);
应该是paint->drawImage(5,5,img)
刚才发错了
paint =new QPainter(this);
定义是在paintEvent外了,
你将paint定义移到paintEvent函数内部
///////////////////////
请问关于QImage Class 的问题
各位大虾:
我现在想做QT下显示经过网络传输过来的BMP图片的界面,是否可以用QImage 这个类来实现呢?
如果可以的话应该怎样做呢?(我看过QImage 这个类好像很多东西啊,应该不用全部都用上吧!)
如果QImage 这个类不能实现的话,那应该怎样实现呢?希望得到各位的帮助,先谢谢了!!
loadFromData()来加载图像,并通过QLabel来显示
/
///////////////////
关于摄像头捕捉图像2
我做的不知道是不是和obrire的一样,但我想摄像头数据截取不分应该是差不多的,
源代码我是不能说的,因为像obrire说的涉及到商业.
基本流程是这样的:先调用系统函数open(dev,O_RDWR);然后开辟共享内存adrr=mmap();adrr是内存首地址;
再调用ioctl (dev, VIDIOCMCAPTURE, &vid_mmap);ioctl (dev, VIDIOCSYNC, &vid_mmap.frame);得到图像;
然后再操作adrr就行了;
注意:没用每用完一次mmap()要记得把他销毁munmap(adrr, size);不然它会从新开辟另一块内存.直到系统内存
被用完.
显示的时候建议先把图像数据拷贝到自己开辟的内存里再对数据进行处理,显示\压缩什么的随你;
显示我的思想方法是,先创建一个Image;然后把数据放到Image里;最后painter出来;
skyly2222,你能不能把最后一步image(),这个参数,我设置不好..,显示效果烂的很..
我只需要几行代码,就是qt部分,其他部分,我已经做完了。
你能用的是
QImage ( uchar * yourdata, int w, int h, int depth, QRgb * colortable, int numColors, Endian bitOrder );
这个函数吧?
这个函数我试过,不行,因为colortable设置不好会倒置象素放大或缩小造成图像混乱;
我是这样解决的.
QRgb rgb;
QPainter *paint=new QPainter;
i=0;
if(bm.create(width,height,32,0,QImage::IgnoreEndian))
{ for (x = 0; x < height ; x++) {
for (y = 0; y <width; y++) {
r=(int)bit[i+2];
g=(int)bit[i+1];
b=(int)bit;
uint *pp = (uint *)bm.scanLine(x) + y;
*pp = qRgb(r,g,b);
i=i+3;
}
}
}
我想请教skly22222,我按照上面步骤写了一个数据采集程序,在QT程序中把它作为 .c文件在工程编译的时候出了问题,原因好像是这部分关于linux下的头文件找不到,但把这个程序作为.h文件时就没有这种问题了,想知道这部分程序是否可以作为.h文件调用,另外我上面问题怎么解决。路过的各位大侠也请不吝赐教,谢谢!!
skly22222,多谢了,我在用图像处理作毕业设计,也是刚用QT,你的这些代码很有用,QT资料太少了,尤其在图像处理这一方面,有没有好的网站或资料介绍一下,让我们少走些弯路!
////////////////////
还是摄像头问题,能显示但没标题栏,无法控制它
部分源码用的如下
paint=new QPainter(this);
paint->begin(this);
v4l_open("/dev/video0",&device);
unsigned char *data = GrabData();
int x,y;
int i=0;
QImage img;
QRgb *point;
int r,g,b;
if(img.create(480,320,32,0,QImage::IgnoreEndian))
{
for(x=0;x<320;x++)
{
for(y=0;y<480;y++)
{
r=(int)data[i+2];
g=(int)data[i+1];
b=(int)data;
point = (QRgb *) img.scanLine(x)+y;
*point = qRgb(r,g,b);
i+=3;
}
}
}
paint->drawImage(10,10,img);
我现在根据上面给出的摄像头的一段程序,自己把它写全,已能在板子上显示了,但是那个图像没含最大化、最小化、关闭按钮的标题栏,请问能把它画在label或是其他qt的类上吗?怎么画呢,我还想加一个按钮来关闭端口。谢谢!
创建个widget。把这段代码写在它的paintEvent里应该就可以了吧
楼主我想请教一下,我按照上面类似的做法,图像不能刷屏,只能显示最初采集的一帧,时什么原因。
因为paintEvent只有在widget接到paint事件的时候才会调用。 你不动它是不会调到paintEvent的
还是加个timer或者在需要刷新的时候调用repaint才行
////////////////
[备份]实现从RGBA32格式的内存数据中初始化一个QImage[lsosa.BIT]
很多人都为如何将内存中某一个格式的数据如何转换成为图片数据显示到屏幕上犯愁,因为这是实现处理视频的一个关键部分,我曾经也是,所以深知其不容易,如今,我这里问题已经解决,所以将解决方法备份与此,仅供参考。
这里提供处理两种数据格式的方法,一种是处理RGB24格式,另一种是RGBA32格式;
说明:
内存中数据保存在pv_frame指针指向的内存空间中;
图象宽度为v_width, the height of it is v_height;(高度是v_height);下面展示方法调用;
RGB24:
/**
* lsosa.BIT
*/
int i;
int r, g, b;
QRgb *point;
uchar *bit;
QImage *pVideoImage = new QImage(width, height, 32);
setWFlags(getWFlags() | Qt::WRepaintNoErase);
// these codes should be optimized in future;
// high cpu taked here;
i = 0;
bit = (uchar *)(_frame);
for(int y = 0; y < v_height; y ++){
for ( int x = 0; x < v_width; x ++ ){
r = (int)bit;
g = (int)bit[i+1];
b = (int)bit[i+2];
point = (QRgb *)pVideoImage->scanLine(y) + x;
*point = qRgb(r, g, b);
i += 3;
}
}
bitBlt(this, 0, 0, pVideoImage);
the details is here:
http://www.qtcn.org/bbs/read.php?tid=3648&page=e&fpage=5
http://www.qtcn.org/bbs/read.php?tid=4990&page=e&fpage=1
RGBA32:
/**
* lsosa.BIT
*/
QImage *pv_image;
if ( pv_image == NULL ){
QImage pv_image = new QImage((uchar *)pv_frame, \
v_width, v_height, 32, NULL, 0, QImage::LittleEndian);
if ( pv_image == NULL ){
return -1;
}
}
all is this...
这里在补充一种方法,你可以使用QImage 的loadFromData方法从一段内存数据中加载图像,例如:
QImage *pf_video_image = new QImage();
pf_video_image->loadFromData(pf_videobuffer, frame_size);
如此应该也可以的;
代码是凭感觉写出来的,为经过测试哦。。。
//////////////////////////
关于摄像头视频捕捉
各位大大:
小弟做了一个摄相头视频捕捉程序,想连续从摄相头来的数据..现在的思路是将摄相头的数据用timer定时读到自己开辟的内存空间中,然后通过image.loadfromdata读出来,然后设置为label背景,label->setPixmap(),但是怎么也显示不出来,我想问问是不是这个思路,和具体的应该用什么控件,和api,请高手指点.....急啊..
共享内存会更快些immap
真是的,LCD驱动有三层,Overlay 1/Overlay 2和FameBuffer
为什么一定要用QT, 就相当于DShow一样,在不同层显示不同应用.还可以支持透明.
我们可以将QT的应用放在FameBuffer(Base Layer)上,而VideoCap的实时内容放
在Overlay2上,这叫回放.而在VideoCap上显示的文字,图标放在Overlay1上呀.
以上三层,包括通道透明处理和灰度处理,都测试通过.
以上便用是商业开发的真正实现.望对诸位有益.
不仅仅是LCD,所有的FameBuffer驱动,都应当支持这三层.
其实Windows也是这样实现的.
VideoCAP就是V4L提供的Linux下的用于电视(数字/模拟)的接收,存储,发布和PVR/DVR应用内核支持组件.
一般来讲,CCD/CMOS的摄像头也是使用此类接口.电视卡一般采用模拟接入,也可以像Windows下进行数据
采集的.
如果你对系统不了解,只知道库,控件什么的,这比较麻烦.
这需要对整个流程非常熟,以及对RGB/YUV的转换非常了解,才能完成实时视频流捕获/压缩和后处理.
很失望的是,这方面没有现成的控件.如果有,也只能使用驱动直接提供的接口.
至于上面有朋友提到什么timer/mmap,这只是在ioctl时,采用的一种技术.一般采用mmap,但这只能
将数据读出来,但你要知道读出来的是什么颜色,什么格式的数据呀?YUV 4:4:2/RGB 8:8:8?还是其它格式?
各种制式还要适合你的显示设备的制式,你的VGA支持哪种格式?一般是YUV 4:2:2.如果你的LCD/VGA等不
持,显示不出来.如果支持相同格式,按byte读出buffer,直接写入或cat到framebuffer上就可以显示出来了.
至于实时的preview,就是Overlay所支持的回放.打开相应的Overlay层,一个while循环就可了了.
以上便是智能设备视频开发流程的全部.
尽管我有全部的代码,但有可能涉及到商业代码,恕不能提供更多技术支持.
所能支持层:目前有一个家公司提供的产品中,能支持mjpeg/3gp播放,但不能实时codec,而以前我们所工作的
平台,能完全实时3gp实时压缩/RTP发布,支持DivX/Xvid.能让mplayer工作于arm平台,很流畅的进行播放.
首先,能对你提供帮助的是,这与QT没有任何关系.
QT只工作于fb0所支持的Base层.这是三层概念.
Base Layer fb0-->就是你的Qtopia可以显示的平面
Overlay 2 -->就是你要看到效果的平面,用于VideoCapture来的数据流实时显示
Overlay 1 -->就是你的数码相机/手机/PDA上,拍摄时,上面显示的按键/调节提示/文字/时间等
至于QTE,它只负责将GUI数据显示于第一层的内存空间
而Overlay 2是你的显示模块能支持最大的全屏图像数据大小的内存空间
Overlay 1是另一片内存区,比Overlay 2要小,主要用于存储最上层的一此提示数据/图像显示
这三层的实时,与嵌入式与否无关.
如还不清楚,建议你看看Intel中IPP关于图像/视频这部分的内容.
这比较麻烦,我只能帮你到这儿.之所以不清楚,是你对这个流程并不清楚.
就是你将数据读出来了,写到你的QT Label内存区间,是不一定显示正常的.这此数据只是颜色数据
这显相于直接写屏呀.不会引起显示的混乱??
/////////////////
加载图片的问题
////////////////////////////////////
renderarea.h
///////////////////////////////////
#include <QWidget.h>
#include <QPainter.h>
#include <QPen.h>
#include <QPixmap.h>
class renderarea:public QWidget
{
public:
renderarea(QWidget *parent=0);
void paintEvent(QPaintEvent *event);
private:
QPen pen;
QPixmap pixmap;
};
////////////////////////////////
renderarea.cpp
///////////////////////////////
#include "renderarea.h"
renderarea::renderarea(QWidget *parent):QWidget(parent)
{
}
void renderarea::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(pen);
painter.drawLine(10,10,60,70);
pixmap.load(":/images/dog.png");
painter.drawPixmap(0,0,pixmap);
}
////////////////////////////////
main.cpp
///////////////////////////////
#include <QApplication.h>
#include "renderarea.h"
int main(int argc,char *argv[])
{
QApplication qapp(argc,argv);
renderarea background;
background.show();
return qapp.exec();
}
//////////////////////////////////
做一个小程序需要加载图片,所以就弄了这个小东西试验一下,编译都通过了
画矩形,画直线都没有问题,但是图片画不出来,不知道原因是什么,看了几个例子都是这么
弄的,不明白为什么到我这就不行了?欢迎大家提出宝贵意见
由于版权原因, Qt对GIF格式支持并不好.
改换个jpg格式的就行了....
经过我逐行检查,发现是图片并没有load成功,希望大家给我分析一下原因
pixmap.load(":/images/dog.png");
//路径问题.你试试用绝对路径
问题解决了,我的是qt4 windows版的,后来我把图片写到qrc文件中,就ok了,谢谢你的帮忙
////////////////
一个图片显示的小程序求教
想写一个简单的在qt下显示图片的程序
可是在编译时老出现这个错误:error: multiple types in one declaration 一个声明指定了多个类型
比如在生成image.o的时候 /usr/lib/qt-3.3/include/qpen.h:88: 错误:一个声明指定了多个类型
在编译main.cpp的时候也有这种情况
/usr/lib/qt-3.3/include/qdesktopwidget.h:43: error: multiple types in one declaration
不知道是自己程序哪个地方出毛病了,反正把image.cpp置空就没这个错误了
多谢
程序如下:
imag.h
Copy code
#ifndef IMAGE_H
#define IMAGE_H
#include <qwidget.h>
#include <qimage.h>
class MyImage : public QWidget
{
public:
MyImage( QWidget *parent=0, const char *name=0, int wFlags=0 );
~MyImage();
bool loadImage( const QString& );
protected:
void paintEvent( QPaintEvent * );
private:
QString filename;
QImage image;
}
#endif
image.cpp
Copy code
#include "image.h"
#include <qpainter.h>
#include <qapplication.h>
#include <qmessagebox.h>
MyImage::MyImage( QWidget *parent, const char *name, int wFlags ):QWidget( parent, name, wFlags )
{
bool ok;
filename = "/opt/program/qt/showimg/save";
ok = loadImage( filename );
printf( "ok = %d \n", ok );
}
MyImage::~MyImage()
{
}
bool MyImage::loadImage( const QString& filename )
{
bool ok;
ok = image.load( filename, 0 );
update();
return ok;
}
void MyImage::paintEvent( QPaintEvent *e )
{
QPainter painter(this);
painter.setClipRect(e->rect());
painter.drawImage( image.width(), image.height(), image );
}
main.cpp
Copy code
#include "image.h"
#include <qapplication.h>
#include <qimage.h>
int main( int argc, char **argv )
{
QApplication a( argc, argv );
MyImage myimage;
a.setMainWidget( &myimage );
myimage.setCaption("image Example");
myimage.show();
return a.exec();
}
大哥。你是我的偶像.
class X
{
//....
}; 这里的';'可不能掉啊,加上就OK了
QT examples showing
这是一个图片显示的例子
QT 2.3.7 QTabel 加载图片的问题 请支招!!!
QT 2.3.7 form1.cpp中,
QPixmap pixmap1( "/root/pic/tabel.png");
table1 = new QTable( this, "table1" );
table1->setGeometry( QRect( 135, 38, 181, 127 ) );
table1->setBackgroundPixmap(pixmap1);
在form1.h中,table1有申明.
问题一: 为什么设置后,显示不出来图片pixmap1,也就是setBackgroundPixmap好像不起作用.
问题二: 在QT3.1.7下,tabel有setReadOnly属性设置单元格是否只读,可是在QT2.3.7下,找不到只读属性.
如何才能显示图片以及设置单元格的只读属性呐?
急盼支招! 谢谢!
///////////////////
QPixmap::loadFromData 里面的 QByteArray & data 是个什么东西呢
bool QPixmap::loadFromData ( const QByteArray & data, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor )
我在Qt程序里读入了一个Qt不支持的图片,pics格式。现在已经可以用程序读入内存。用QImage的setPixel 的时候,读入图片的速度比较慢。所以在寻求其他的方法。
看到前面大家讨论说可以直接读buffer, 我想这个方法可能可以吧。
所以想问问这个QByteArray & data是什么呢,该怎么用阿。
/////////////////////////////
请问一下,我在linux下用QT3写的一个界面的显示,出现闪屏的问题
我在linux下用QT3写的一个界面的显示,在LCD上显示时出现严重的闪屏现象,因为数据和图形要实时更新,现在想不出什么好的办法来解决,因为我也是初次接触QT。有同学跟我说用什么双缓冲可能可以,但是我还不太明白要用到哪些函数,,请高手指点一下,或可以提供些相关的资料,谢谢了
双缓冲并不需要什么特别的函数,原理就是把图画好后再放在屏幕上显示.
void QProgressBar::drawContents( QPainter *p )
{
const QRect bar = contentsRect();
QPixmap pm( bar.size() );
QPainter paint( &pm );
const QPixmap * bgPixmap = backgroundPixmap();
QBrush fbrush = ( bgPixmap ? QBrush( backgroundColor(), *bgPixmap ) :
QBrush( backgroundColor() ) );
if ( bgPixmap && !isTopLevel() && (backgroundOrigin() != WidgetOrigin) )
paint.setBrushOrigin( -x(), -y() );
paint.fillRect( bar, fbrush );
paint.setFont( p->font() );
QStyle::SFlags flags = QStyle::Style_Default;
if (isEnabled())
flags |= QStyle::Style_Enabled;
if (hasFocus())
flags |= QStyle::Style_HasFocus;
style().drawControl(QStyle::CE_ProgressBarGroove, &paint, this,
QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarGroove, this), this ),
colorGroup(), flags);
style().drawControl(QStyle::CE_ProgressBarContents, &paint, this,
QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarContents, this), this ),
colorGroup(), flags);
if (percentageVisible())
style().drawControl(QStyle::CE_ProgressBarLabel, &paint, this,
QStyle::visualRect(style().subRect(QStyle::SR_ProgressBarLabel, this), this ),
colorGroup(), flags);
paint.end();
p->drawPixmap( bar.x(), bar.y(), pm );
}
////////////////////
【提问】实时视频采集在多线程编程中实现的问题?
我使用QT designer作了一个程序,程序要求可以视频实时采集,我用一个窗口来显示摄像头捕捉的视频,我可以使用QThread类来实现这个视频采集,可是视频显示的程序是一个无限循环,这样Qt 的GUI 主事件线程就会一直在等待视频采集的结束
,这样我的主界面mainform就不能运行了,主界面上的各个控件就会无响应。
如何才能让这个视频采集程序在后台运行,并在主程序里控制视频采集程序的开始和暂停?
请各位大侠帮忙!!!!
你看看这个程序看能否有帮助 ,我以前好像也遇到过这样的情况 ,不过比你的简单
////////////////////////////////////////////////////////
#include <qapplication.h>
#include <qhbox.h>
#include <qthread.h>
#include <qlabel.h>
class WaitThread: public QThread
{
public:
WaitThread(QThread *thr1, QThread *thr2, QLabel *lbl);
void run();
private:
QThread *thread1, *thread2;
QLabel *label;
};
WaitThread::WaitThread(QThread *thr1, QThread *thr2, QLabel *lbl)
: thread1(thr1), thread2(thr2), label(lbl)
{
}
void WaitThread::run()
{
thread1->wait();
thread2->wait();
qApp->lock();
label->setText("<h1>Done!</h1>");
qApp->unlock();
}
class GUIThread : public QThread
{
public:
GUIThread( QLabel*, const QString& );
protected:
void run();
private:
QLabel* label;
QString text;
};
static QMutex* mutex;
GUIThread::GUIThread( QLabel* l, const QString& t )
: label( l ), text( t )
{
}
void GUIThread::run()
{
for ( int i = 0; i < 2; i++ ) {
mutex->lock();
qApp->lock();
label->setText(text);
qApp->unlock();
sleep( 1 );
mutex->unlock();
}
}
// The program starts here
int main( int argc, char** argv )
{
QApplication app( argc, argv );
mutex = new QMutex;
QHBox box( 0, 0, TRUE );
QLabel label( &box );
label.setAlignment(Qt::AlignCenter);
label.setMinimumSize(400, 300);
GUIThread first( &label, "<b>Ping</b>" );
GUIThread second( &label, "<i>Pong</i>" );
WaitThread third(&first, &second, &label);
first.start();
second.start();
app.setMainWidget( &box );
box.show();
third.start();
int r = app.exec();
delete mutex;
return r;
}
我前一段时间做的是一个线程不断的采集数据,然后在一个窗口显示.没有用你说的QWaitCondition::wait .
程序大概如下:
class Mythread::wait : public QThread {
Mythread(Qlabel *label);
public:
virtual void run();
};
MyThread::MyThread(QLabel* l ): label( l)
{
}
void MyThread::run()
{
for( ; ; ) {
sleep( 1 );
label->setText("ping");
qDebug( "Ping!" );
}
}
再参照上面的程序大概就行了
/////////////
【提问】在qt界面设计中怎么显示图像?
我想知道QT中的IconView怎么用?还有要想选择不同的图像让它在界面上显示,应该怎么办呢? 大家给我个思路吧,我的脑子很不明白,下一步怎么走?
谢谢啦:)
在Qt中有QLable类,可以用
void QLabel::setPixmap ( const QPixmap & )
就可以显示图像了
QPixmap *pixmap = new QPixmap(filePath);
QLabel *label;
label->setPixmap(*pixmap);
//////////////////////
【提问】关于在label上显示图片的问题!!【已解决】
我要设计一个能显示图片的界面,还要改变大小、对比度等,但是我在设置button和label的布局之后就不会显示图片了,example里好像没有将图片显示在label上,编译没有问题,但是总是显示
QObject::connect: No such slot Mywindow::loadImage()
QObject::connect: (sender name: 'unnamed')
QObject::connect: (receiver name: 'unnamed')
我用的是QT3.1,loadImage()是仿着一个例子写的,也不知道怎么改。
load有些图片时又显示“浮点数例外”,这个又是什么问题?难道是图片格式不对?
问题已解决了,convertFromImage()实现了,还是谢谢大家了!
我现在也在做显示图片并进行处理的工作,摆放好部件后,在ui.h中编函数时,总是有错误,您能指点一下吗?谢谢
我回答行不行?(每次我好像都是不请自到的)
ui_*.h开头的都是自动生成文件,你要继承这个类,然后在你的新类中使用。
可以参考Qt的示例:C:\Qt\4.1.4\examples\widgets\imageviewer
也可以参考我写的一个小程序
http://www.qtcn.org/bbs/read.php?tid=6546
///////////////
下面是我的程序:
while (1)
{
buffer=v4lsyn(dev1,i);
fprintf (stderr, "readjusting width to %d\n", *buffer);
img=new QImage((unsigned char*)buffer,640,480,8,0,0,QImage::IgnoreEndian);
v4lcapture(dev1);
connect( timer, SIGNAL(timeout()), SLOT(repaint( TRUE )) );
timer->start( 100 );
}
}
void imageprocess::paintEvent( QPaintEvent * )
{
paint->begin(this);
paint->drawImage(0,0,*img);
paint->end();
if( paint->isActive() ){
paint->end();
}
}
我的buffer中有连续的值,但是就是显示不出来,不知道为什么,大虾,帮忙分析一下
相关阅读 更多 +