2009年7月5日 星期日

Qt製作動畫




太高興了,搞了快2天才知道動畫原理,我新增了一個QThread的Class,然後要在此Class作一個信號槽(SIGNAL),連到
QWidget的SlOT,一直沒注意到應該跟QTimer類似,才想很久才想通,當然用QTimer也可達到動畫效果,只是我要用QThread來達成,彈性較大

Wthread.h
--------------------------------------------------------------------------

#ifndef WTHREAD_H
#define WTHREAD_H

#include
class Wthread:public QThread
{
Q_OBJECT
public:
Wthread(QObject *parent = 0);
~Wthread();
//信號
signals:
void setxy(int i1, int i2,int i3,int i4);
protected:
void run();
};

#endif // WTHREAD_H
----------------------------------------------------------------------------
Wthread.cpp
----------------------------------------------------------------

#include "wthread.h"
#include
Wthread::Wthread(QObject *parent)
: QThread(parent)
{




}
void Wthread::run() {

for(int i = 10; i 300; i += 10) {

emit setxy(i,i,i,i);
msleep(1000);
}

}
Wthread::~Wthread()
{

}
--------------------------------------------------------------------
Widget.cpp
----------------------------------------------------------------------------
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
#include
#include
#include "wthread.h"
Widget::Widget(QWidget *parent)
: QWidget(parent), ui(new Ui::Widget)
{

ui->setupUi(this);
setShape(20,20,120,120);
step_value=0;
//qRegisterMetaType("i1");
connect(&thread, SIGNAL(setxy(int , int ,int ,int )),this, SLOT(setShape(int ,int ,int ,int )));


}

Widget::~Widget()
{
delete ui;

}
//重畫
void Widget::setShape(int x,int y,int w,int h)
{
shapex=x;
shapey=y;
shape_width=w;
shape_height=h;
update();
}

void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPainterPath path;
painter.setBrush(QColor(122, 163, 39));
path.addRect(shapex, shapey, shape_width, shape_height);
painter.drawPath(path);

}

void Widget::on_pushButton_pressed()
{
step_value= step_value+10;
setShape(20,20,120+step_value,120+step_value);
}

void Widget::on_pushButton_2_pressed()
{
step_value= step_value-10;
setShape(20,20,120+step_value,120+step_value);
}

void Widget::on_pushButton_3_pressed()
{
thread.start();
}







又作一個,做在QFrame裡面



重前面幾段,就可完成一個動畫,又能一邊控制物件移動,就可用Qt來作簡單的遊戲了,來看下面的例子


read more...

2009年7月4日 星期六

Qt畫圖



畫圖很簡單,問題是我要按一下按鈕就會重劃,找很久,才知道他的原理,首先要重新宣告paintEvent,要把處裡畫圖寫到這裡面,然後用update(),重劃
下面就是一個例子,setShape(int x,int y,int w,int h)是一個重劃函式,給了一個座標,和寬高,update來達成重劃矩形
paintEvent則重新宣告來畫圖(這裡是畫矩形)

void Widget::setShape(int x,int y,int w,int h)
{
shapex=x;
shapey=y;
shape_width=w;
shape_height=h;
update();
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPainterPath path;
painter.setBrush(QColor(122, 163, 39));
path.addRect(shapex, shapey, shape_width, shape_height);
painter.drawPath(path);
painter.restore();
}
------------------------slot函數-----------------------------------
void Widget::on_pushButton_pressed()
{
step_value= step_value+10;
setShape(20,20,120+step_value,120+step_value);
}

void Widget::on_pushButton_2_pressed()
{
step_value= step_value-10;
setShape(20,20,120+step_value,120+step_value);
}
------------------------------------------------------------------------
下面就是一個簡單例子,每當我按一次放大,長寬會加10,縮小則減10



read more...

2009年6月30日 星期二

用Qt Creator設計元件隨視窗改變大小

設計元件中layouts,就是我們要的,先把這些擺好,譬如要擺一組6個水平button,就加一個horizontal Layout,再把6個button丟進去,OK後在主frame按右鍵->Lay out -> Lay out in a grid這樣就大功告成.(如下圖)





























read more...

2009年6月28日 星期日

用Qt Creator加上背景圖案

1.必須先增加Resource file.(New->Qt->Resource file)
2.在
Resource file點Add->Add Prefix->Add->Add Files->選背景圖
3.File->Save All
4.mainwindow.ui右下視窗有->styleSheet->Add Resource->background-images(小箭頭)->Reload一下
->選圖檔,大功告成

把背景換成kitty的圖案

read more...

2009年6月25日 星期四

xmms2_v2.1播放介面發佈

修正一些BUG,可聽線上廣播

下載xmms2_v2.1播放介面(ubuntu9.04)

下載xmms2_v2.1播放介面(debian5.0)->因為debian qt還不是最新,拉桿會失效,只能用滑鼠滾輪



畫面




read more...

2009年6月19日 星期五

Qt寫的Xmms2播放介面第一版發布.

最新的,看起來有點像樣了,可聽線上廣播,新增時鐘,可調音量,多增一個列表區,面板和按鈕作一些調整,還沒上傳,等在調整好一些在上傳,debian5.0,和ubuntu9.04測試OK,其他版LINUX應該也OK.






























































據續上篇,把空格檔名無法加入xmms2 list,和一些小BUG解掉,增加暫停,添加功能,自動從使用者展開檔案tree,滑鼠小提示.
添加歌曲改成用下面,空格檔名就能加到xmms2 list,試很久才成功
---------------------------------------------------------------------------------
QProcess *myP = new QProcess(this); //宣告QProcess
QStringList arguments;
arguments << "add" <<>

---------------------------------------------------------------------------------
取得user name我在網路上找到,修改一下user_name.replace("\n",""),必須去掉換行,試很久才成功
--------------------------------------------------------------------------------

char text[255];
//FILE *name;
FILE *name;
name = popen("whoami", "r");
fgets(text, sizeof(text), name);
pclose(name);
user_name=text; //使用者name
user_name=user_name.replace("\n",""); //要把換行去掉
user_path = "/home/"+user_name.replace("\n",""); //使用者目錄
----------------------------------------------------------------------------------

開放原碼:

xmms2播放介面下載(new)


來幾張執行結果:















































這張是加了Icon比較漂亮(要先取得Qt執行檔位置,加icon才不會跑掉)

strPath = QApplication::applicationDirPath();//Qt取得執行檔位置

















把介面弄好看一些,加上顯示正在播放歌曲,即時時間,這部份要寫接收信號,搞很久才成功,進度顯示棒還沒完成,比之前那版好多了.
















進度棒也寫好了,主要是處理接收xmms2 status 的信號後,要如何得到一首歌共幾秒,和目前播到第幾秒,QRegExp 是Qt正規表示很像bash shell的正規表示,然後用replace換掉就可得到想要的.





void MainWindow::progressBar_step_set(QString str)
{
QString strx1=str;
QString strx2=str;
QRegExp rx1(" of .*$");
QRegExp rx2("^.* of ");
QString timer_set_str=strx1.replace(rx1,"");
QString timer_max_str=strx2.replace(rx2,"");
QRegExp mrx(":.*$");
QRegExp srx("^.*:");
QString m_timer_set_str=timer_set_str;
QString s_timer_set_str=timer_set_str;
QString msrt_set=m_timer_set_str.replace(mrx,""); //minute_set
QString ssrt_set=s_timer_set_str.replace(srx,""); //second_set
QString m_timer_max_str=timer_max_str;
QString s_timer_max_str=timer_max_str;
QString msrt_max=m_timer_max_str.replace(mrx,""); //minute_max
QString ssrt_max=s_timer_max_str.replace(srx,""); //second_max
int m_set = m_timer_set_str.toInt();
int s_set = s_timer_set_str.toInt();
int m_max = m_timer_max_str.toInt();
int s_max = s_timer_max_str.toInt();
int max_value = m_max*60 + s_max; //整首歌有幾秒
int set_value = m_set*60 + s_set; //正播到第幾秒
ui->progressBar->setValue(set_value);
ui->progressBar->setMaximum(max_value);


}

加上音量控制,還發現只要把串流加到xmms2,就可聽線上廣播(下一版的重點).


read more...

2009年6月17日 星期三

用Qt寫的,初步堪用xmms2的播放介面.

據續上篇,終於初步完成堪用的xmms2播放介面(要先安裝xmms2,才能用,我只是用Qt去執行xmms2的指令),還有BUG要解,若是列表沒音樂按播放會關掉視窗,若是當按或目錄有空格用xmms2 add加不上列表,還有介面太醜要美化.
mainwindow.cpp程式碼(部落格因為不能顯示<>很麻煩,將程式碼放到下面超連結)

http://sites.google.com/site/yplinshouye/Home/xmms2_gui

執行結果:



read more...