Qt dxlib 调用与简单应用
2015-08-11 16:14
351 查看
百度了很多都没找到,国内很少用这个库的,dxlib作者给出的g++配置不会用,dxlib库是静态库,各个库之间还有调用顺序,qt是动态库,两者共同调用出现各种错误,自己瞎弄了半个多月,才配置好.
qt5.5+vs2010+dxlib库
dxlib库 http://homepage2.nifty.com/natupaji/DxLib/
我是小白,说的好多不对的,这样配置很麻烦,应用时还有好多错误,希望有大神把简单的配置方法告诉一下。
具体配置如下:
1.静态编译qt,这一步最重要,解决动态库与静态库之间的问题,把他们都变成静态库(实在不会写代码正确调用dxlib静态库)
先安装要求的那几个软件,再检测有没有在系统变量中,具体网上有,本人安装了vs版的和mingw,两个版本,运行时找不到qmake,又重新设置了qmake,自学真是处处碰壁
配置的代码,好像少编译了很多,i5的本子用了也就两个小时
configure -confirm-license -opensource -platform win32-msvc2010 -debug-and-release -static -prefix "D:\QT\5.5-static-vs2010" -qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug
-no-angle -nomake tests -nomake examples -skip qtwebkit
2.编译完成后在.pro文件中加入库的路径,各个静态库(有顺序!!!!!!!)
LIBS += "C:\Users\Desktop\vsku\Dxlib.lib"
LIBS += "C:\Users\Desktop\vsku\DxDrawFunc_d.lib"
LIBS += "C:\Users\Desktop\vsku\DxLibW_d.lib"
LIBS += "C:\UsersDesktop\vsku\DxUseCLibW_d.lib"
LIBS += "C:\Users\Desktop\vsku\libbulletcollision_vc6_d.lib"
LIBS += "C:\Users\Desktop\vsku\libbulletdynamics_vc6_d.lib"
LIBS += "C:\Users\Desktop\vsku\libbulletmath_vc6_d.lib"
LIBS += "C:\Users\Desktop\vsku\libtiff_d.lib"
LIBS += "C:\Users\Desktop\vsku\libpng_d.lib"
LIBS += "C:\Users\Desktop\vsku\zlib_d.lib"
LIBS += "C:\Users\Desktop\vsku\libjpeg_d.lib"
LIBS += "C:\Users\Desktop\vsku\ogg_static_d.lib"
LIBS += "C:\Users\Desktop\vsku\vorbis_static_d.lib"
LIBS += "C:\Users\Desktop\vsku\vorbisfile_static_d.lib"
LIBS += "C:\Users\Desktop\vsku\libtheora_static_d.lib"
3.最后可以导入并显示pmd,mqo,x,模型,具体调用函数里面有实例
导入的模型在qt下有的不能正常显示,但在vs却可正常显示,不知道怎么处理了,本来想把mmd的模型显示窗口单独出来,再加上一个音乐播放器,实现类似桌面宠物类的功能,再加上一个网站,上传pmd模型和vmd动作数据的这样一个想法,本人技术水平有限,只做出了大体功能,遇到上面的问题,实在不想做了,只能暂时放弃了,有想做的大神带我一下.......................................................
贴上我做的代码:
qt5.5+vs2010+dxlib库
dxlib库 http://homepage2.nifty.com/natupaji/DxLib/
我是小白,说的好多不对的,这样配置很麻烦,应用时还有好多错误,希望有大神把简单的配置方法告诉一下。
具体配置如下:
1.静态编译qt,这一步最重要,解决动态库与静态库之间的问题,把他们都变成静态库(实在不会写代码正确调用dxlib静态库)
先安装要求的那几个软件,再检测有没有在系统变量中,具体网上有,本人安装了vs版的和mingw,两个版本,运行时找不到qmake,又重新设置了qmake,自学真是处处碰壁
配置的代码,好像少编译了很多,i5的本子用了也就两个小时
configure -confirm-license -opensource -platform win32-msvc2010 -debug-and-release -static -prefix "D:\QT\5.5-static-vs2010" -qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug
-no-angle -nomake tests -nomake examples -skip qtwebkit
2.编译完成后在.pro文件中加入库的路径,各个静态库(有顺序!!!!!!!)
LIBS += "C:\Users\Desktop\vsku\Dxlib.lib"
LIBS += "C:\Users\Desktop\vsku\DxDrawFunc_d.lib"
LIBS += "C:\Users\Desktop\vsku\DxLibW_d.lib"
LIBS += "C:\UsersDesktop\vsku\DxUseCLibW_d.lib"
LIBS += "C:\Users\Desktop\vsku\libbulletcollision_vc6_d.lib"
LIBS += "C:\Users\Desktop\vsku\libbulletdynamics_vc6_d.lib"
LIBS += "C:\Users\Desktop\vsku\libbulletmath_vc6_d.lib"
LIBS += "C:\Users\Desktop\vsku\libtiff_d.lib"
LIBS += "C:\Users\Desktop\vsku\libpng_d.lib"
LIBS += "C:\Users\Desktop\vsku\zlib_d.lib"
LIBS += "C:\Users\Desktop\vsku\libjpeg_d.lib"
LIBS += "C:\Users\Desktop\vsku\ogg_static_d.lib"
LIBS += "C:\Users\Desktop\vsku\vorbis_static_d.lib"
LIBS += "C:\Users\Desktop\vsku\vorbisfile_static_d.lib"
LIBS += "C:\Users\Desktop\vsku\libtheora_static_d.lib"
3.最后可以导入并显示pmd,mqo,x,模型,具体调用函数里面有实例
导入的模型在qt下有的不能正常显示,但在vs却可正常显示,不知道怎么处理了,本来想把mmd的模型显示窗口单独出来,再加上一个音乐播放器,实现类似桌面宠物类的功能,再加上一个网站,上传pmd模型和vmd动作数据的这样一个想法,本人技术水平有限,只做出了大体功能,遇到上面的问题,实在不想做了,只能暂时放弃了,有想做的大神带我一下.......................................................
贴上我做的代码:
#ifndef MMMWINDOW_H
#define MMMWINDOW_H
#include <QMainWindow>
#include <QMainWindow>
#include<QDragEnterEvent>
#include<QMimeData>
#include<QDebug>
#include<QMediaPlayer>
#include<QDebug>
#include<QListWidgetItem>
#include<QTime>
#include<QUrl>
#include<QTimer>
#include"modeldisplaywindow.h"
namespace Ui {
class MmmWindow;
}
class MmmWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MmmWindow(QWidget *parent = 0);
~MmmWindow();
protected:
void dragEnterEvent(QDragEnterEvent *e);
void dropEvent(QDropEvent *e);
void getplaytimeandplay();
private slots:
void on_pauseOrplayButton_clicked();
void on_songlistWidget_itemDoubleClicked(QListWidgetItem *item);
void on_nextButton_clicked();
void on_lastButton_clicked();
void on_timeSlider_sliderMoved(int position);
void on_voiceSlider_valueChanged(int value);
void timesliderchange(qint64 value);
void timesliderrange(qint64 value);
void on_modellistWidget_itemDoubleClicked(QListWidgetItem *item);
void on_motionlistWidget_itemDoubleClicked(QListWidgetItem *item);
void on_modeldisplayButton_clicked();
private:
Ui::MmmWindow *ui;
QStringList songlist,modellist,motionlist;
bool playflag;
QMediaPlayer *player;
QListWidgetItem *lastsongitem,*lastmodelitem,*lastmotionitem;
int lastsongnum, lastmodelnum,lastmotionnum;
double interval;
QTimer *test;
QString tempdir,tempdir1,tempdirchange;
ModelDisplayWindow *modelplay1;
int clicknum;
bool modeldisplayflag;
QString a;
QFile *temp;
};
#endif // MMMWINDOW_H
#ifndef MODELDISPLAYWINDOW_H
#define MODELDISPLAYWINDOW_H
#include <QWidget>
#include"DxLib.h"
#include<QString>
class ModelDisplayWindow : public QWidget
{
Q_OBJECT
public:
explicit ModelDisplayWindow(QWidget *parent = 0);
void getmodel(QString modelname);
int ModelHandle, AttachIndex ;
float TotalTime,PlayTime;
void clear();
public slots:
void modelplay();
};
#endif // MODELDISPLAYWINDOW_H
#include "mmmwindow.h"
#include "ui_mmmwindow.h"
MmmWindow::MmmWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MmmWindow)
{
ui->setupUi(this);
player=new QMediaPlayer;
playflag=false;
clicknum=0;
modeldisplayflag=false;
player->setVolume(10);
ui->voiceSlider->setValue(10);
ui->pauseOrplayButton->setIcon(QIcon(":/image/play.ico"));
temp=new QFile;
interval=1000.0/60.0;
lastmodelnum=-1;
lastmotionnum=-1;
lastsongnum=-1;
test=new QTimer;
test->setInterval(interval);
modelplay1=new ModelDisplayWindow();
connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(timesliderchange(qint64)));
connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(timesliderrange(qint64)));
connect(test,SIGNAL(timeout()),modelplay1,SLOT(modelplay()));
}
MmmWindow::~MmmWindow()
{
delete ui;
}
void MmmWindow::dragEnterEvent(QDragEnterEvent *e)
{
if(e->mimeData()->hasUrls())
e->acceptProposedAction();
else e->ignore();
}
void MmmWindow::dropEvent(QDropEvent *e)
{
if(e->mimeData()->hasUrls())
{
QList<QUrl> urls = e->mimeData()->urls();
qDebug() <<urls;
for(int i=0;i< urls.size();i++)
{
if(urls.at(i).toString().right(3) == "mp3")
{
QString qstr = urls.at(i).toString().mid(8,urls.at(i).toString().length() - 8);
songlist += qstr;
ui->songlistWidget->addItem(urls.at(i).fileName());
}
if(urls.at(i).toString().right(3) == "pmd")
{
QString qstr = urls.at(i).toString().mid(8,urls.at(i).toString().length() - 8);
modellist += qstr;
ui->modellistWidget->addItem(urls.at(i).fileName());
}
if(urls.at(i).toString().right(3) == "vmd")
{
QString qstr = urls.at(i).toString().mid(8,urls.at(i).toString().length() - 8);
motionlist += qstr;
ui->motionlistWidget->addItem(urls.at(i).fileName());
}
}
}
if(songlist.size()!=0&&lastsongnum==-1)
{
ui->songlistWidget->setCurrentRow(0);
}
if(modellist.size()!=0&&lastmodelnum!=-1)
{
ui->modellistWidget->setCurrentRow(0);
}
if(motionlist.size()!=0&&lastmotionnum!=-1)
{
ui->motionlistWidget->setCurrentRow(0);
}
}
void MmmWindow::on_pauseOrplayButton_clicked()
{
if(lastsongnum!=-1)
{
if(playflag==false)
{
ui->pauseOrplayButton->setIcon(QIcon(":/image/pause.ico"));
playflag=true;
if(songlist.size()==0)
{
}
else
{
player->play();
test->start();
}
}
else
{
playflag=false;
player->pause();
test->stop();
ui->pauseOrplayButton->setIcon(QIcon(":/image/play.ico"));
}
}
}
void MmmWindow::on_songlistWidget_itemDoubleClicked(QListWidgetItem *item)
{
if(lastsongnum==-1)
{
item->setTextColor(QColor(255,0,0));
}
else
{
lastsongitem->setTextColor(QColor(0,0,0));
item->setTextColor(QColor(255,0,0));
if(modeldisplayflag==true)
{
test->stop();
modelplay1->clear();
clicknum++;
ui->modeldisplayButton->setText("显示模型");
}
}
ui->pauseOrplayButton->setIcon(QIcon(":/image/pause.ico"));
if(playflag==false)
{
playflag=true;
player->setMedia(QMediaContent(songlist.at(ui->songlistWidget->currentRow())));
player->play();
}
else
{
playflag=true;
player->pause();
player->setMedia(QMediaContent(songlist.at(ui->songlistWidget->currentRow())));
player->play();
}
lastsongitem=item;
lastsongnum=ui->songlistWidget->currentRow();
}
void MmmWindow::on_nextButton_clicked()
{
if(lastsongnum!=-1&&ui->songlistWidget->currentRow()<songlist.size()-1)
{
if(playflag==true)
{
player->pause();
player->setMedia(QMediaContent(songlist.at(ui->songlistWidget->currentRow()+1)));
ui->songlistWidget->setCurrentRow(ui->songlistWidget->currentRow()+1);
player->play();
lastsongitem->setTextColor(QColor(0,0,0));
lastsongitem=ui->songlistWidget->currentItem();
lastsongitem->setTextColor(QColor(255,0,0));
}
else
{
playflag=true;
ui->pauseOrplayButton->setIcon(QIcon(":/image/pause.ico"));
player->setMedia(QMediaContent(songlist.at(ui->songlistWidget->currentRow()+1)));
ui->songlistWidget->setCurrentRow(ui->songlistWidget->currentRow()+1);
player->play();
lastsongitem->setTextColor(QColor(0,0,0));
lastsongitem=ui->songlistWidget->currentItem();
lastsongitem->setTextColor(QColor(255,0,0));
}
lastsongnum=ui->songlistWidget->currentRow();
}
}
void MmmWindow::on_lastButton_clicked()
{
if(player->media().isNull()==false&&ui->songlistWidget->currentRow()>0)
{
if(playflag==true)
{
player->pause();
player->setMedia(QMediaContent(songlist.at(ui->songlistWidget->currentRow()-1)));
ui->songlistWidget->setCurrentRow(ui->songlistWidget->currentRow()-1);
player->play();
lastsongitem->setTextColor(QColor(0,0,0));
lastsongitem=ui->songlistWidget->currentItem();
lastsongitem->setTextColor(QColor(255,0,0));
}
else
{
playflag=true;
ui->pauseOrplayButton->setIcon(QIcon(":/image/pause.ico"));
player->setMedia(QMediaContent(songlist.at(ui->songlistWidget->currentRow()-1)));
ui->songlistWidget->setCurrentRow(ui->songlistWidget->currentRow()-1);
player->play();
lastsongitem->setTextColor(QColor(0,0,0));
lastsongitem=ui->songlistWidget->currentItem();
lastsongitem->setTextColor(QColor(255,0,0));
}
lastsongnum=ui->songlistWidget->currentRow();
}
}
void MmmWindow::on_timeSlider_sliderMoved(int position)
{
player->setPosition(position);
if(modeldisplayflag==true)
{
test->stop();
getplaytimeandplay();
}
}
void MmmWindow::on_voiceSlider_valueChanged(int value)
{
player->setVolume(value);
QString str;
ui->voicelabel->setText(str.setNum(ui->voiceSlider->value()));
}
void MmmWindow::timesliderchange(qint64 value)
{
ui->timeSlider->setSliderPosition(value);
QTime duration(0, value / 60000, qRound((value % 60000) / 1000.0));
ui->currenttimelabel->setText(duration.toString("mm:ss"));
}
void MmmWindow::timesliderrange(qint64 value)
{
ui->timeSlider->setMaximum(value);
QTime duration(0, value / 60000, qRound((value % 60000) / 1000.0));
ui->totaltimelabel->setText(duration.toString("mm:ss"));
}
void MmmWindow::on_modellistWidget_itemDoubleClicked(QListWidgetItem *item)
{
if(lastmodelnum!=-1)
{
lastmodelitem->setTextColor(QColor(0,0,0));
item->setTextColor(QColor(255,0,0));
lastmodelitem=item;
lastmodelnum=ui->modellistWidget->currentRow();
}
else
{
item->setTextColor(QColor(255,0,0));
lastmodelitem=item;
lastmodelnum=ui->modellistWidget->currentRow();
if(modeldisplayflag==true)
{
test->stop();
// tempdir=motionlist.at(lastmotionnum);
tempdir1=modellist.at(ui->modellistWidget->currentRow());
tempdirchange=tempdir1.insert(tempdir1.length()-4,"000");
tempdirchange=tempdirchange.replace(tempdirchange.length()-3,3,"vmd");
temp->copy(tempdir,tempdirchange);
a=modellist.at(lastmodelnum);
modelplay1->getmodel(a);
getplaytimeandplay();
}
}
}
void MmmWindow::on_motionlistWidget_itemDoubleClicked(QListWidgetItem *item)
{
if(lastmotionnum!=-1)
{
lastmotionitem->setTextColor(QColor(0,0,0));
item->setTextColor(QColor(255,0,0));
lastmotionitem=item;
}
else
{
item->setTextColor(QColor(255,0,0));
lastmotionitem=item;
}
lastmotionnum=ui->motionlistWidget->currentRow();
tempdir=motionlist.at(lastmotionnum);
tempdir1=modellist.at(lastmodelnum);
tempdirchange=tempdir1.insert(tempdir1.length()-4,"000");
tempdirchange=tempdirchange.replace(tempdirchange.length()-3,3,"vmd");
temp->copy(tempdir,tempdirchange);
}
void MmmWindow::on_modeldisplayButton_clicked()
{
if(clicknum==0)
{
modeldisplayflag=true;
a=modellist.at(lastmodelnum);
modelplay1->getmodel(a);
getplaytimeandplay();
ui->modeldisplayButton->setText("隐藏模型");
}
else if(clicknum%2==1)
{
modeldisplayflag=false;
modelplay1->clear();
test->stop();
ui->modeldisplayButton->setText("显示模型");
}
else
{
modeldisplayflag=true;
getplaytimeandplay();
ui->modeldisplayButton->setText("隐藏模型");
}
clicknum++;
}
void MmmWindow::getplaytimeandplay()
{
modelplay1->PlayTime=(player->position())/60.0;
test->start();
}
#include "modeldisplaywindow.h"
#include"QDebug"
ModelDisplayWindow::ModelDisplayWindow(QWidget *parent) : QWidget(parent)
{
ChangeWindowMode( true) ;
SetUseBackBufferTransColorFlag( TRUE ) ;
SetAlwaysRunFlag(true);
DxLib_Init();
// MV1SetLoadModelUsePhysicsMode( DX_LOADMODEL_PHYSICS_REALTIME ) ;
}
void ModelDisplayWindow::getmodel(QString modelname)
{
std::string str=modelname.toStdString();
const char* ch=str.c_str();
ModelHandle = MV1LoadModel( ch ) ;
qDebug()<<ModelHandle;
SetDrawScreen( DX_SCREEN_BACK ) ;
// カメラに映る範囲( カメラからの距離の範囲 )を設定
SetCameraNearFar( 10.0f, 1000.0f ) ;
// カメラの位置と向きを設定
SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 19.0f, -22.5f ), VGet( 0.0f, 10.0f, 0.0f ) ) ;
// 3Dモデルの0番目のアニメーションをアタッチする
AttachIndex = MV1AttachAnim( ModelHandle, 0, -1, FALSE ) ;
// アタッチしたアニメーションの総再生時間を取得する
TotalTime = MV1GetAttachAnimTotalTime( ModelHandle, AttachIndex ) ;
qDebug()<<TotalTime;
// 物理演算の状態をリセット
MV1PhysicsResetState( ModelHandle ) ;
}
void ModelDisplayWindow::modelplay()
{
ClearDrawScreen();
PlayTime += 0.5f ;
qDebug()<<PlayTime;
MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;
MV1PhysicsCalculation( ModelHandle, 1000.0f / 60.0f ) ;
MV1DrawModel( ModelHandle ) ;
ScreenFlip() ;
}
void ModelDisplayWindow::clear()
{
ClearDrawScreen();
ScreenFlip() ;
}
#include "mmmwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MmmWindow w;
w.show();
return a.exec();
}
相关文章推荐
- mousebutton和mousebuttons使用的区别
- 转载:pyqt线程间通过 信号/槽 通信
- Qt中int转换成QString
- Qt 5.3 下OpenCV 2.4.11 开发(14)开运算与闭运算
- Qt 5.3 下OpenCV 2.4.11 开发(13)腐蚀与膨胀
- qt dbus 的一入门文章
- QT中关线程的问题
- 【Qt OpenGL教程】24:扩展、剪裁和TGA图像文件的手动加载
- QTP录制delphi程序,可录制无法运行
- CodeBlocks配置Qt 环境(含:预编译头文件,Qt设计师)
- Qt 5.3 下OpenCV 2.4.11 开发(12)meanShift 简单算法介绍
- Erlang MQTT消息服务器
- Qt 5.3 下OpenCV 2.4.11 开发(11)CamShift 目标跟踪
- QT信号和槽使用自定义的类或结构体
- 解决Qt中QLabel控件加载动态图出现黑色背景的问题
- 图像处理之qt实现
- Qt Mac 在软件 icns图标制作
- 从 Qt 的 delete 说开来
- Qt 的QString类的使用
- VS2010平台下VAssistX和Qt的整合配置及相关便捷操作