static void audio_encode(const char *filename)
{
AVCodec *codec;
AVCodecContext *c = NULL;
int frame_size, i, j, out_size, outbuf_size;
FILE *f;
short *samples;
float t, tincr;
uint8_t *outbuf;
codec = avcodec_find_encoder(CODEC_ID_MP2);
if(!codec)
{
fprintf(stderr, "codec not found\n");
exit(1);
}
c = avcodec_alloc_context3(codec);
c->bit_rate = 64000;
c->sample_rate = 44100;
c->channels = 1;
c->sample_fmt = AV_SAMPLE_FMT_S16;
if(avcodec_open(c, codec) < 0)
{
fprintf(stderr, "could not open codec\n");
exit(1);
}
frame_size = c->frame_size;
samples = malloc(frame_size * 2 * c->channels);
outbuf_size = 10000;
outbuf = malloc(outbuf_size);
f = fopen(filename, "wb");
if(!f)
{
fprintf(stderr, "could not open %s\n", filename);
exit(1);
}
/* encode a single tone sound */
t = 0;
tincr = 2 * M_PI * 440.0 / c->sample_rate;
for(i=0;i<200;i++) {
for(j=0;j<frame_size;j++) {
samples[2*j] = (int)(sin(t) * 10000);
samples[2*j+1] = samples[2*j];
t += tincr;
}
/* encode the samples */
out_size = avcodec_encode_audio(c, outbuf, outbuf_size, samples);
fwrite(outbuf, 1, out_size, f);
}
fclose(f);
free(outbuf);
free(samples);
avcodec_close(c);
av_free(c);
}
有時候,有必要當QPushButton為Hover狀態(tài)的時候能發(fā)生消息,以便能執(zhí)行一些動作,當時QPushButton并沒有相應的信號。
我訂制的QHoverButton如下:
class QHoverButton : public QPushButton
{
Q_OBJECT
public:
QHoverButton(QWidget* parent = 0);
QHoverButton(const QString &text,QWidget* parent = 0);
~QHoverButton();
signals:
void enter();
void denter();
private:
void enterEvent(QEvent* event);
void leaveEvent(QEvent* event);
};
QHoverButton::QHoverButton(QWidget* parent):
QPushButton(parent)
{
}
QHoverButton::QHoverButton(const QString &text,QWidget* parent):
QPushButton(text,parent)
{
}
QHoverButton::~QHoverButton()
{
}
void QHoverButton::enterEvent(QEvent* event)
{
emit enter();
}
void QHoverButton::leaveEvent(QEvent* event)
{
emit denter();
}
在這里使用QWidget虛函數(shù)enterEvent,leaveEvent來發(fā)送hover消息
具體就是實現(xiàn)函數(shù)contextMenuEvent
(QContextMenuEvent* event
)在其中加入popMenu
->addAction
(action);
為了響應action,則可以鏈接action的click(),trigger()函數(shù)和處理函數(shù)
另外,有事情右鍵菜單選項需要根據(jù)鼠標所指項顯示,則可以使用
QTableWidgetItem* item = itemAt(mapFromGlobal(QCursor::pos()));
if(item != NULL)
{
獲取當前表格項
需要說的是開始我總是使用setCellWidget設置表格單元,導致itemAt總是返回空值,而實際應該使用的是函數(shù)setItem.
感覺QTableWidget此類設計有點問題!
QGroupBox基本如下:
class Q_GUI_EXPORT QGroupBox : public QWidget
{
public:
explicit QGroupBox(QWidget* parent=0);
explicit QGroupBox(const QString &title, QWidget* parent=0);
~QGroupBox();
QString title() const;
void setTitle(const QString &title);
Qt::Alignment alignment() const;
void setAlignment(int alignment);
QSize minimumSizeHint() const;
bool isFlat() const;
void setFlat(bool flat);
bool isCheckable() const;
void setCheckable(bool checkable);
bool isChecked() const;
public Q_SLOTS:
void setChecked(bool checked);
Q_SIGNALS:
void clicked(bool checked = false);
void toggled(bool);
};
其中
setFlat控制顯示外框與否
setCheckable()設置QGroupBox是否為活動狀態(tài)
如果可以當前QGroupBox是活動狀態(tài),則點擊QGroupBox則激發(fā)toggled
有時候單靠使用QT的Layout無法保持,就需要調(diào)整QLayout的參數(shù)了
QLayout::SetDefaultConstraint | 0 | The main widget's minimum size is set to minimumSize(), unless the widget already has a minimum size. |
QLayout::SetFixedSize | 3 | The main widget's size is set tosizeHint(); it cannot be resized at all. |
QLayout::SetMinimumSize | 2 | The main widget's minimum size is set to minimumSize(); it cannot be smaller. |
QLayout::SetMaximumSize | 4 | The main widget's maximum size is set to maximumSize(); it cannot be larger. |
QLayout::SetMinAndMaxSize | 5 | The main widget's minimum size is set to minimumSize() and its maximum size is set to maximumSize(). |
QLayout::SetNoConstraint4 | 1 | The widget is not constrained. |
QLayout默認的主控件大小就是主控件的大小
要調(diào)整布局效果可以調(diào)用setSizeConstraint函數(shù)
如果不想當布局變化的時候改變控件大小就可以設置布局為SetFixedSize
其余類似
QTableWidget要設置項標題
關鍵的二個函數(shù)是
setColumnCount以及setHorizontalHeaderLabels
注意其使用程序是
首先調(diào)用
setColumnCount
然后設置表頭標簽鏈表
setorizontalHeaderLabels
如果這二個函數(shù)次序
摘要: QVariant是一種可以存儲不同類型的數(shù)據(jù)結構,在很多場合這是很有用得為了達到這種目的,可以想象,該對象應該存儲對象的類型信息,數(shù)據(jù)信息以及其他輔助詳細考慮用途,這種對象必須支持對不同對象的存儲,對存儲類型的檢測以及取對象三個功能1.對象的存儲代碼見下:Code highlighting produced by Actipro CodeHighlighter (freeware)http://w...
閱讀全文
剛使用VC編譯過了QT4.7,具體步驟如下:
1.下載QT源碼壓縮包:
http://download.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.7.4.zip
2.解壓壓縮包到D盤下
3.添加系統(tǒng)變量PATH=D:\qt-everywhere-opensource-src-4.7.4\bin
QTDIR=D:\qt-everywhere-opensource-src-4.7.4
4.cmd進入vc目錄執(zhí)行vcvars32.bat
5.進入QT目錄執(zhí)行configure
6.輸入o選擇開源項目
7.配置完成后執(zhí)行nmake進行編譯
現(xiàn)在Android很熱,很多人都是在linux下編譯Android程序的,但是知道能在Eclipse下開發(fā)Android應用的人不多。
我說下如何在Eclipse下編譯Android應用
1.首先在Linux下編譯好Android大版本
2.進入out/../target/common/obj/java_imminatelibraried目錄,找出如下三個文件夾(core_immiaterlibraeted,framework_immiatelibraied,ext_immiatelibrary)下的classed.jar文件.
重新命名為core.jar,framwork.jar,ext.jar
然后復制到開發(fā)機器上
3.新建Android工程,移除原有的Android包,導入必要的java包,新建jar庫,導入這3個jar包即可使用
本方法都大部分應用有效
QRegex提供字符串驗證,匹配,搜索,替換和切割的功能
一個比較簡單的例子是
QRegExp exp("-(.*)\(");
exp.setMinimal(true);
這兒匹配的是以-開頭,以(結束的字符串
基本的QRegex
1.isValid()判斷給定表達式是否合法
2.errorString()檢錯誤和isValid()類似
3.isEmpty()判斷正則表達式是否為空
4.caseSensitivity()檢測大小寫敏感
5.pattern()獲取正則表達式本身
6.capturedTexts
獲取捕獲的所有字符串
7.cap()獲取捕獲的字符串索引從1開始
8.numCaptures()返回匹配的字符串個數(shù)
9.
indexIn ( const QString & str, int offset = 0, CaretMode caretMode= CaretAtZero ) const
從字符串給定偏移匹配之
10.還有一個函數(shù)需要交代的是setMinimal(int minimal)
該函數(shù)主要作用是開啟或者關閉最小匹配
舉一個例子:
"We must be <b>bold</b>, very <b>bold</b>!" and the pattern <b>.*</b>.
如果設置正則表達式為<b>.*</b>
如果設置為最大匹配,則捕獲到<b>bold</b>,very <b>bold</b>
如果設置為正則表達式,
則第一次匹配到第一個<b>bold</b>
第二次匹配到第二個<b>bold</b>
基本的正則表達式如下:
\r 回車
\n 換行
\t 制表
\\ \本身
\" "
\^ ^
\$ $
\s 匹配空白符
\~ 匹配字符串開始
$ 匹配字符串結束
\b 單詞的開始或者結束
[] 匹配其中的一個字符 比如[abc]匹配a,b或者c [^abc]匹配a,b,c之外的字符 [a-c] 匹配a到c之間的字符
{n} 匹配出現(xiàn)n次 比如ab{2} 相當于abb ab{1,3}相當于ab,abb,abbb
{n,}最少出現(xiàn)n次
? 出現(xiàn)0,1次 比如ab[cd]?相當于ab,abc,abd
++ 最少出現(xiàn)1次
* 不出現(xiàn)或者出現(xiàn)任意次,比如\^*c匹配 d,^d,^^d等