比較簡單的辦法如下:
QWidget *spacer = new QWidget(this);
spacer->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
toolBar->addWidget(spacer);
但是如何右對齊的是一個自定義的復(fù)合控件,則無能為力,比如一個編輯框和一個搜索按鈕
這種情況下可以使用QLayout和QSpacerItem即可完成,如下:
QWidget* searchWidget = new QWidget(this);
mToolbar->addWidget(searchWidget);
QHBoxLayout* searchLayout = new QHBoxLayout(searchWidget);
QSpacerItem* spacer = new QSpacerItem(40,20,QSizePolicy::Expanding,QSizePolicy::Minimum);
searchLayout->addItem(spacer);
mSearchButtonWidget = new QPushButton(tr("搜索"),searchWidget);
mSearchEditWidget = new QLineEdit(searchWidget);
mSearchEditWidget->setMaximumWidth(120);
searchLayout->addWidget(mSearchEditWidget);
searchLayout->addWidget(mSearchButtonWidget);
原因是QToolBar本身就是一個QWidget
腳本如下:
from bs4 import BeautifulSoup
def list_get(file):
soup = BeautifulSoup(open(file))
alist = soup.find_all('a',class_ = 'link')
list = []
for i in alist:
list.append(i.get('href'));
#for i in list:
# print(i)
return list
if __name__=="__main__":
list_get('List.htm')
list_get函數(shù)返回的是list字符串對象
其c語言調(diào)用的代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <Python.h>
char* GDALPythonObjectToCStr(PyObject* pyObject);
int main(int argc, char *argv[])
{
Py_Initialize();
if(!Py_IsInitialized())
{
return -1;
}
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./script')");
PyObject* pModule;
PyObject* pDict;
PyObject* pFunc;
pModule = PyImport_ImportModule("list");
if(!pModule)
{
printf("can't find list.py");
system("PAUSE");
getchar();
return -1;
}
pDict = PyModule_GetDict(pModule);
if(!pDict)
{
return -1;
}
pFunc = PyDict_GetItemString(pDict,"list_get");
if(!pFunc || !PyCallable_Check(pFunc))
{
printf("can't find function [list_get]");
getchar();
return -1;
}
PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args,0,Py_BuildValue("s","List.htm"));
PyObject* value = PyObject_CallObject(pFunc,args);
int ret = PySequence_Check(value);
printf("check:%d\n",ret);
int length = PySequence_Size(value);
printf("length:%d\n",length);
int i = 0;
for(;i<length;i++)
{
PyObject* obj = PySequence_GetItem(value,i);
//char* str = PyBytes_AS_STRING(obj);
char* str = GDALPythonObjectToCStr(obj);
printf("link:%s\n",str);
free(str);
}
Py_DECREF(args);
Py_DECREF(pModule);
Py_Finalize();
system("PAUSE");
return 0;
}
/* Return a NULL terminated c String from a PyObject */
/* Result must be freed with GDALPythonFreeCStr */
char* GDALPythonObjectToCStr(PyObject* pyObject)
{
#if PY_VERSION_HEX >= 0x03000000
if(PyUnicode_Check(pyObject))
{
char *pszStr;
char *pszNewStr;
Py_ssize_t nLen;
PyObject* pyUTF8Str = PyUnicode_AsUTF8String(pyObject);
PyBytes_AsStringAndSize(pyUTF8Str,&pszStr,&nLen);
pszNewStr = (char*)malloc(nLen+1);
memcpy(pszNewStr,pszStr,nLen+1);
Py_XDECREF(pyUTF8Str);
return pszNewStr;
}
else if(PyBytes_Check(pyObject))
{
char *pszStr;
char *pszNewStr;
Py_ssize_t nLen;
PyBytes_AsStringAndSize(pyObject,&pszStr,&nLen);
pszNewStr = (char*)malloc(nLen+1);
memcpy(pszNewStr,pszStr,nLen+1);
return pszNewStr;
}
else
{
char *pszStr = (char*)malloc(1);
pszStr[0] = '\0';
return pszStr;
}
#else
return PyString_AsString(pyObject);
#endif
}
不得不承認(rèn),有時候使用python比c++方便很多,
就拿解析html來說,使用 Beautiful Soup 就比使用libtidy方便很多 - 當(dāng)然也有可能是
Beautiful Soup封裝的很厲害吧
使用Beautiful Soup的一個例子如下:
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('List.htm'))
for a in soup.find_all('a',class_ = 'link'):
print (a.get('href'))
目的是找出html中class屬性為link的a節(jié)點對應(yīng)的href屬性字符串
如果是使用c++ libtidy的話
對應(yīng)的代碼如下:
Bool TIDY_CALL tidyFilterCb(TidyDoc tdoc,TidyReportLevel lvl,uint line,uint col,ctmbstr mssg)
{
return no;
}
void extractContent(TidyNode node,TidyDoc doc);
void parseContent(TidyNode node,TidyDoc doc)
{
TidyNode child;
for(child = tidyGetChild(node);child;child = tidyGetNext(child))
{
if(tidyNodeIsA(child))
extractContent(child,doc);
else
parseContent(child,doc);
}
}
void extractContent(TidyNode node,TidyDoc doc)
{
if(yes == tidyNodeIsA(node))
{
TidyAttr cls = tidyAttrGetCLASS(node);
if(cls != NULL)
{
char* value = (char*)tidyAttrValue(cls);
if(!strcmp(value,"link"))
{
TidyAttr href = tidyAttrGetHREF(node);
if(href != NULL)
{
char* link = (char*)tidyAttrValue(href);
printf("link:%s\n",link);
return;
}
}
}
}
parseContent(node,doc);
}
void tidyParseHtml(char* file)
{
TidyDoc doc = tidyCreate();
tidySetReportFilter(doc,tidyFilterCb);
tidyParseFile(doc,file);
TidyNode body = tidyGetBody(doc);
TidyNode child;
for(child = tidyGetChild(body);child;child = tidyGetNext(child))
{
parseContent(child,doc);
}
tidyRelease(doc);
}
還是很啰嗦的
當(dāng)然下面的python代碼也能完成任務(wù):
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('List.htm'))
list = soup.select('a[class="link"]')
for a in list:
if a.has_attr('href'):
print (a.get('href'))
如果想分析網(wǎng)頁我覺得BeatifulSoup絕對是一個利器
鏈接:
http://www.crummy.com/software/BeautifulSoup/bs4/doc/
gaudio是一個基于C/C++混合編程的跨平臺音頻庫,當(dāng)前支持windows32/64操作系統(tǒng)和linux32位操作系統(tǒng)
當(dāng)前性能:
1.最大支持音源同時播放的格式-8
2.單音源最大掛載的音效個數(shù)-8
3.全局最大可掛載的音效個數(shù)-8
4.當(dāng)前支持語言C/C++/C#
5.當(dāng)前支持的OS Win32/Win64/Linux32
6. 當(dāng)前支持的音效-Fade in,Fade Out,Bassboost,Speed Changer,Echo,3D Effect, Doppler, Phaser, Channel Merget, Channel Swap, Fft, Distortion, Foldback Distortion, Modulator, AutoWah 等
7.當(dāng)前支持的解碼格式 - WAV, AU, AIFF, OGG, MOD,IT,XM,S3M,WV,MPC,WV,TTA,MP3,MIDI,FLAC
8.支持的編碼格式 - WAV,AU,AIFF,OGG,MP2,MP3,FLAC,AAC,WV,VOC,CAF
9.支持的音頻加載模式 - 文件加載,內(nèi)存加載,虛擬文件加載
10.支持PAN,環(huán)繞音,全音量,音源音量設(shè)置
下一步計劃:
1.DEPHI綁定
2.MAC OS支持
3.Flanger,Chorus音效
4.TAK,AAC格式
5.故障處理
遠(yuǎn)景:
1.支持所有平臺和手持設(shè)備
2.支持常見的所有音頻格式
3.支持常見的所有音效
4.提高最易用最方便的API接口
一個使用的小例子:
/*
GAudio 2.1.0.1, (C)2013 by Eric Du(E)
This program is a part of the GAudio SDK.
Use GAudio's echo effect
*/
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include "gaudio.h"
int main(int argc,char* argv[])
{
printf("echo created by D.Eric\n");
#if(defined(WIN32) || defined(WIN64))
gaudio_init("addons");
#else
gaudio_init("/usr/local/lib/gaudio/");
#endif
const char* filename = "..\\media\\hurnscald.ogg";
gsource* source = gaudio_source_create_from_file(filename,FALSE);
if(source == NULL)
{
printf("load file:%s error!\n",filename);
printf("bad source.\nerror code:%d.\n",gaudio_error_get());
gaudio_deinit();
return -1;
}
gaudio_source_set_int32(source,AUDIO_ENUM_LOOP,FALSE);
printf("play filename:%s\n",filename);
geffect* effect = gaudio_effect_create(AUDIO_EFFECT_ECHO,0);
if(!effect)
{
printf("not support echo effect\n");
gaudio_source_destroy(source);
gaudio_deinit();
return -1;
}
gaudio_effect_set_float(effect,AUDIO_EFFECT_ECHO_DELAY,1.0f);
gaudio_effect_set_float(effect,AUDIO_EFFECT_ECHO_DECAY,0.6f);
gaudio_effect_bind(effect,0);
gaudio_source_play(source,FALSE);
printf("\nplaying, press any key to quit.\n");
getch();
gaudio_effect_unbind(effect);
gaudio_effect_destroy(effect);
gaudio_source_stop(source);
gaudio_source_destroy(source);
gaudio_deinit();
system("PAUSE");
return EXIT_SUCCESS;
}
這個代表了我當(dāng)前對音頻這塊的了解程度
下載在這里:
download歡迎提意見啊.
摘要: 1.Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/* === Shared === */QStackedWidget, QLabel, QPushButton, QRadioBu...
閱讀全文
發(fā)現(xiàn)一個問題imageView.startAnimation啟動控件動畫以后
由于一些原因需要設(shè)置控件為GONE狀態(tài),也就是imageView.s
etVisibility(View.GONE);
之后發(fā)現(xiàn)控件處于GONE狀態(tài),但是控件還是可見的
上網(wǎng)查了下發(fā)現(xiàn)要清空動畫,也就是imageView.clearAnimation
其實我覺得如果調(diào)用setVisibility(View.GONE)之后無論當(dāng)前有無動畫都應(yīng)該消失
設(shè)置為GONE狀態(tài)后控件狀態(tài)出現(xiàn)異常
按照當(dāng)前情況要隱藏控件需要先調(diào)用cleanAnimation,之后call setVisibility
所以有空想想android API也并非十全十美.
各位覺得呢?
截圖如下:
2013年10月6日星期日

代碼見附件:
/Files/gaimor/GPlayer.zip
摘要: 之前寫了一個dll,具體在這里http://www.shnenglu.com/gaimor/anarchive/2013/07/11/201711.html現(xiàn)在想增加一個c#綁定,上網(wǎng)搜了下很簡單就實現(xiàn)了實現(xiàn)后的cs代碼如下(當(dāng)前只實現(xiàn)了一部分):Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.Co...
閱讀全文
1. -static-libstdc++ for libstdc
++-6.dll2. -static-libgcc for libgcc_s_dw2-1.dll
直接上代碼:
#include <stdio.h>
#include <ao/ao.h>
#include "mpg123.h"
int main(int argc, char *argv[])
{
ao_initialize();
mpg123_handle *mpg123 ;
int iMpg123_error;
if(MPG123_OK != (iMpg123_error = mpg123_init()))
{
printf("failed to init mpg123\n");
return -1;
}
mpg123 = mpg123_new(mpg123_decoders()[0], &iMpg123_error);
if(MPG123_OK != (iMpg123_error = mpg123_open(mpg123,argv[1])))
{
fprintf(stderr,"error in open mp3 file\n");
return -1;
}
int rate,channel,encoding;
mpg123_getformat(mpg123,&rate,&channel,&encoding);
int default_driver = ao_default_driver_id();
ao_sample_format format;
memset(&format,0,sizeof(format));
format.bits = 16;
format.channels = channel;
format.rate = rate;
format.byte_format = AO_FMT_LITTLE;
ao_device *device;
device = ao_open_live(default_driver,&format,NULL);
if(device == NULL)
{
fprintf(stderr,"error opening device.\n");
return 1;
}
short buffer[4096];
int read = 0;
while(1)
{
mpg123_read(mpg123,buffer,4096,&read);
if(read == 0)
break;
ao_play(device,buffer,read);
}
mpg123_close(mpg123);
ao_close(device);
ao_shutdown();
return 0;
}