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状态的时候能发生消息,以便能执行一些动作,当时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虚函数enterEvent,leaveEvent来发送hover消息
具体就是实现函数contextMenuEvent
(QContextMenuEvent* event
)在其中加入popMenu
->addAction
(action);
为了响应action,则可以链接action的click(),trigger()函数和处理函数
另外,有事情右键菜单选项需要根据鼠标所指项显示,则可以使用
QTableWidgetItem* item = itemAt(mapFromGlobal(QCursor::pos()));
if(item != NULL)
{
获取当前表格项
需要说的是开始我总是使用setCellWidget设置表格单元,导致itemAt总是返回空值,而实际应该使用的是函数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是否为活动状态
如果可以当前QGroupBox是活动状态,则点击QGroupBox则激发toggled
有时候单靠使用QT的Layout无法保持,就需要调整QLayout的参数了
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默认的主控件大小就是主控件的大小
要调整布局效果可以调用setSizeConstraint函数
如果不想当布局变化的时候改变控件大小就可以设置布局为SetFixedSize
其余类似
QTableWidget要设置项标题
关键的二个函数是
setColumnCount以及setHorizontalHeaderLabels
注意其使用程序是
首先调用
setColumnCount
然后设置表头标签链表
setorizontalHeaderLabels
如果这二个函数次序
摘要: QVariant是一种可以存储不同类型的数据结构,在很多场合这是很有用得为了达到这种目的,可以想象,该对象应该存储对象的类型信息,数据信息以及其他辅助详细考虑用途,这种对象必须支持对不同对象的存储,对存储类型的检测以及取对象三个功能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.添加系统变量PATH=D:\qt-everywhere-opensource-src-4.7.4\bin
QTDIR=D:\qt-everywhere-opensource-src-4.7.4
4.cmd进入vc目录执行vcvars32.bat
5.进入QT目录执行configure
6.输入o选择开源项目
7.配置完成后执行nmake进行编译
现在Android很热,很多人都是在linux下编译Android程序的,但是知道能在Eclipse下开发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
然后复制到开发机器上
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()返回匹配的字符串个数
9.
indexIn ( const QString & str, int offset = 0, CaretMode caretMode= CaretAtZero ) const
从字符串给定偏移匹配之
10.还有一个函数需要交代的是setMinimal(int minimal)
该函数主要作用是开启或者关闭最小匹配
举一个例子:
"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} 匹配出现n次 比如ab{2} 相当于abb ab{1,3}相当于ab,abb,abbb
{n,}最少出现n次
? 出现0,1次 比如ab[cd]?相当于ab,abc,abd
++ 最少出现1次
* 不出现或者出现任意次,比如\^*c匹配 d,^d,^^d等