我的代码如下,如果把winId()传给SDL_putenv,结果是能够在整个widget中显示的,但我要想新建一个小widgt,并通过widget_player->width()将窗口传给SDL_putenv就会出错。不知道什么地方出了问题。我是想把FFPLAY嵌入到QT中,这只是一个实验的例子。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef Q_WS_WIN
#include
#elif defined Q_WS_X11
#include
#endif
#undef main
#include
#include
#include
class SDLWidget : public QWidget
{
Q_OBJECT
public:
SDLWidget()
:refreshTimer(0), windowInitialized(false), screen(0), StarNumbers(100)
{
//setAttribute(Qt::WA_PaintOnScreen);
//setAttribute(Qt::WA_NoSystemBackground);
if (this->objectName().isEmpty())
this->setObjectName(QString::fromUtf8("QT_player"));
this->resize(358, 339);
this->setWindowIcon(QIcon());
#if 1
vboxLayout = new QVBoxLayout(this);
vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
widget_player = new QWidget(this);
setObjectName(QString::fromUtf8("widget_player"));
widget_player->setAttribute(Qt::WA_PaintOnScreen);
widget_player->setAttribute(Qt::WA_NoSystemBackground);
vboxLayout->addWidget(widget_player);
progressBar_play = new QProgressBar(this);
progressBar_play->setObjectName(QString::fromUtf8("progressBar_play"));
progressBar_play->setWindowModality(Qt::NonModal);
progressBar_play->setValue(0);
progressBar_play->setTextVisible(false);
vboxLayout->addWidget(progressBar_play);
hboxLayout = new QHBoxLayout();
hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
pushButton_play = new QPushButton(this);
pushButton_play->setObjectName(QString::fromUtf8("pushButton_play"));
hboxLayout->addWidget(pushButton_play);
pushButton_pause = new QPushButton(this);
pushButton_pause->setObjectName(QString::fromUtf8("pushButton_pause"));
hboxLayout->addWidget(pushButton_pause);
pushButton_fseek = new QPushButton(this);
pushButton_fseek->setObjectName(QString::fromUtf8("pushButton_fseek"));
hboxLayout->addWidget(pushButton_fseek);
pushButton_bseek = new QPushButton(this);
pushButton_bseek->setObjectName(QString::fromUtf8("pushButton_bseek"));
hboxLayout->addWidget(pushButton_bseek);
vboxLayout->addLayout(hboxLayout);
this->setWindowTitle(QApplication::translate("player", "player", 0, QApplication::UnicodeUTF8));
pushButton_play->setText(QApplication::translate("player", "play", 0, QApplication::UnicodeUTF8));
pushButton_pause->setText(QApplication::translate("player", "pause", 0, QApplication::UnicodeUTF8));
pushButton_fseek->setText(QApplication::translate("player", ">>", 0, QApplication::UnicodeUTF8));
pushButton_bseek->setText(QApplication::translate("player", "<<", 0, QApplication::UnicodeUTF8));
Q_UNUSED(this);
QMetaObject::connectSlotsByName(this);
#endif
starfield.resize(100);
initStarfield();
resize(320, 200);
refreshTimer = new QTimer(this);
connect(refreshTimer, SIGNAL(timeout()), this, SLOT(onRefresh()));
refreshTimer->start(70);
}
virtual ~SDLWidget()
{
SDL_Quit();
}
protected:
virtual void showEvent(QShowEvent *e)
{
(void)e;
if(!windowInitialized)
{
char windowid[64];
sprintf(windowid, "SDL_WINDOWID=0x%lx", widget_player->winId());
printf( "SDL_WINDOWID=0x%lx", widget_player->winId());
printf( "SDL_WINDOWID=0x%lx", winId());
SDL_putenv(windowid);
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode( widget_player->width(), widget_player->height(), 0, SDL_SWSURFACE);
windowInitialized = true;
}
}
private:
struct Star
{
float x, y, z;
};
private:
Star generateStar()
{
Star s = {(::rand() / (static_cast(RAND_MAX) + 1.0)) * 20-10,
(::rand() / (static_cast(RAND_MAX) + 1.0)) * 20-10,
(::rand() / (static_cast(RAND_MAX) + 1.0)) * 100};
return s;
}
void initStarfield()
{
for(StarField::iterator it = starfield.begin();
it != starfield.end();
++it)
{
*it = generateStar();
}
}
void updateStarfield()
{
for(StarField::iterator it = starfield.begin();
it != starfield.end();
++it)
{
--it->z;
if(it->z <= 0)
{
*it = generateStar();
}
}
}
void drawStarfield()
{
int w = widget_player->width()/2;
int hw = w >> 1;
int h = height()/2;
int hh = h >> 1;
for(StarField::iterator it = starfield.begin();
it != starfield.end();
++it)
{
int screenX = static_cast((it->x / it->z) * w + hw);
int screenY = static_cast((it->y / it->z) * h + hh);
if(screenX < 0 || screenX > 319 || screenY < 0 || screenY > 199)
continue;
putpixel(screen, screenX, screenY, SDL_MapRGBA(screen->format,
0xfe, 0xef, 0xcc, 0xff));
}
}
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch(bpp) {
case 1:
*p = pixel;
break;
case 2:
*(Uint16 *)p = pixel;
break;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;
case 4:
*(Uint32 *)p = pixel;
break;
}
}
private slots:
void onRefresh()
{
if(windowInitialized && screen)
{
SDL_LockSurface(screen);
SDL_FillRect(screen, NULL, 0);
drawStarfield();
SDL_UnlockSurface(screen);
SDL_UpdateRect(screen, 0, 0, 0, 0);
updateStarfield();
}
}
private:
QTimer *refreshTimer;
bool windowInitialized;
SDL_Surface *screen;
QVBoxLayout *vboxLayout;
QWidget *widget_player;
QProgressBar *progressBar_play;
QHBoxLayout *hboxLayout;
QPushButton *pushButton_play;
QPushButton *pushButton_pause;
QPushButton *pushButton_fseek;
QPushButton *pushButton_bseek;
typedef std::vector StarField;
StarField starfield;
const int StarNumbers;
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
::srand(::time(NULL));
SDLWidget *sdlw = new SDLWidget;
sdlw->show();
return app.exec();
}
#include "main.moc"
阅读(1392) | 评论(0) | 转发(0) |