目录存档: 事件处理

09 2012

对QT中信号槽连接了解不够,导致逻辑错误

- no title specified


对QT中信号槽连接了解不够,导致逻辑错误

牵涉到的代码:

信号:

void MoneyChanged(qint32 NewMoney); //!<钱数已经改变。

成员函数:

/*!

*@brief 卖出当前货物。

*@param Good2Sell 当前要卖出的货物。

*/

void ShangHaiYanMoJi::SellGood(Good * Good2Sell)

{

QSpinBox * CrtSellSpinBox=0; //当前商品的卖出数量旋转框。

qint32 CrtPrice=0; //当前商品的价格。

Good * CrtGood=0; //当前商品。

qint32 EarnedMoney=0; //此次赚到的钱。

qint32 CrtAvePrice=0; //当前商品的平均进价。

CrtGood=Good2Sell; //当前商品的指针。

CrtPrice=CrtGood->GetPrice(); //获取当前商品的价格。

CrtSellSpinBox=CrtGood->GetSellSpinBox(); //获取卖出数量旋转框的指针。

if (CrtSellSpinBox->value()) //真正卖出咯东西,则进行结算。

{

CrtAvePrice=CrtGood->GetAvePrice(); //获取平均进价。

EarnedMoney=CrtSellSpinBox->value()*(CrtPrice-CrtAvePrice); //计算出赚到的钱数。

Money+=CrtSellSpinBox->value()*CrtPrice; //更新钱数。

emit MoneyChanged(Money); //钱数已经改变。

if (EarnedMoney>=0) //记录利润。

{

CrtGood->AddProfit(EarnedMoney); //记录利润。

} //if

else //记录亏损。

{

CrtGood->AddLose(EarnedMoney); //记录亏损。

} //else

CrtGood->AddTradeAmount(CrtSellSpinBox->value()); //记录交易量。

CrtGood->SubAmount(CrtSellSpinBox->value()); //减少存货。出货。

// CrtSellSpinBox->setMaximum(CrtSellSpinBox->maximum()-CrtSellSpinBox->value()); //设置新的最大值,这是在当前情况下能卖的商品个数。

// CrtAmountLcd=CrtGood->GetAmountLcd(); //获取商品存货数量二极管。

// CrtAmountLcd->display(CrtSellSpinBox->maximum()); //显示存货数量。

// ComputeBuySell(); //计算能买卖的货的个数。

//取出视口的矩形,将这个矩形向下移动一段距离,距离的值为当前滚动条的值。产生一个新的矩形,这个新的矩形就是用户当前实际看到的区域。

QRect CrtRect=ui->PlayScrollArea->viewport()->rect(); //取得视口的矩形。

CrtRect.moveTop(ui->PlayScrollArea->verticalScrollBar()->value()); //移动矩形。

qDebug() << __FILE__ << __LINE__ << __func__ << tr(“Scroll area height:”) << ui->PlayScrollArea->height(); //Debug.

qDebug() << __FILE__ << __LINE__ << __func__ << tr(“Scroll area widget height:”) << ui->PlayScrollArea->widget()->height(); //Debug.

if (Good2Sell->GetFrame()) //框架存在。

{

QuePourGold(Good2Sell); //将下泼金币动画添加到队列中。

PourGoldTimer.start(); //启动向下泼金币效果的定时器。

} //if

//创建“飞行文字”的队列:

QueFlyText(Good2Sell,EarnedMoney); //将飞行文字效果添加到队列中。

FlyTextTimer.start(); //启动飞行文字效果的定时器。

if (EarnedMoney>0) //是赚咯钱,则显示庆祝视频。

{

ShowCelibVideo(Good2Sell); //显示庆祝视频。

} //if

} //if

return;

} //void ShangHaiYanMoJi::SellGood(Good * Good2Sell)

信号槽:

/*!

*@brief 刷新总资产。

*@param NewDay 新的天数。

*/

void ShangHaiYanMoJi::RefreshAsset(qint32 NewDay)

{

(void)(NewDay); //不使用勒個参数。

Good * CrtGood=0; // 当前商品。

qint32 NewAsset=0; //新的总资产数。

foreach(CrtGood,GoodList) //一个个商品地计算。

{

NewAsset+=CrtGood->GetPrice()*CrtGood->GetAmount(); //加上当前商品的资产。

} //foreach

NewAsset+=Money; //加上现金。

//在二极管中显示资产数:

if (ui->AssetLcdNumber->checkOverflow(NewAsset)) //溢出。

{

qint32 DigitCount=ceil(log10(NewAsset)); //计算出位数。

if (NewAsset==pow(10,DigitCount)) //正好是10的幂.

{

DigitCount++; //再多一位。

} //if

ui->AssetLcdNumber->setDigitCount(DigitCount); //设置位数。

ui->AssetLcdNumber->updateGeometry(); //更新几何属性。

} //if

ui->AssetLcdNumber->display(NewAsset); //显示资产数。

emit AssetChanged(NewAsset); //发射信号,资产发生变化。

return;

} //void ShangHaiYanMoJi::RefreshAsset(qint32 NewDay)

连接:

connect(this,SIGNAL(MoneyChanged(qint32)),this,SLOT(RefreshAsset(qint32))); //当钱数发生改变时,刷新总资产。

预期的行为及错误:

在界面中“卖出”一定数量的某個商品时,对其进行处理的就是void ShangHaiYanMoJi::SellGood(Good * Good2Sell)函数。在这個函数中,會从界面上对应于该商品的“卖出数量”控件( QSpinBox * CrtSellSpinBox=0; //当前商品的卖出数量旋转框。,同时用来表示该商品当前有多少存货)里获取卖出的商品的数量,计算出这些数量的商品卖得的钱数,加到系统的现金数量( qint64 Money; //!<当前拥有的钱。)中去,再从界面上对应于该商品的“卖出数量”控件里减去要“卖出”的商品数量。同时发送信号( void MoneyChanged(qint32 NewMoney); //!<钱数已经改变。)以告知系统的现金总数发生变化。

由“钱数变化”信号(void MoneyChanged(qint32 NewMoney);)引发“更新资产数量”(void ShangHaiYanMoJi::RefreshAsset(qint32 NewDay))信号槽。在这個信号槽中會遍历所有种类的商品,获取其存货数量(通过前面所说的“卖出数量”控件),计算出其价值,加起来,再加上现金数量,即为系统中当前的总资产数。然后在界面上更新资产数。

本来由程序计算出来的资产数应当与由人来手动计算出的资产数相等,但是在实际调试中却不相等。程序计算出来的资产数总會多一些,而从具体的数值上来看,好像程序把刚“卖出”的商品计算咯两次一样。

出错原因:

根据出错的现象跟踪到void ShangHaiYanMoJi::SellGood(Good * Good2Sell)函数的代码中,就知道原因咯。具体的在这里:

EarnedMoney=CrtSellSpinBox->value()*(CrtPrice-CrtAvePrice); //计算出赚到的钱数。

Money+=CrtSellSpinBox->value()*CrtPrice; //更新钱数。

emit MoneyChanged(Money); //钱数已经改变。

if (EarnedMoney>=0) //记录利润。

{

CrtGood->AddProfit(EarnedMoney); //记录利润。

} //if

else //记录亏损。

{

CrtGood->AddLose(EarnedMoney); //记录亏损。

} //else

CrtGood->AddTradeAmount(CrtSellSpinBox->value()); //记录交易量。

CrtGood->SubAmount(CrtSellSpinBox->value()); //减少存货。出货。

其中,是最后的CrtGood->SubAmount(CrtSellSpinBox->value()); //减少存货。出货。这一句来将界面上的“卖出数量”控件的值减少的,此句代码位于发射“钱数改变”信号的代码(emit MoneyChanged(Money); //钱数已经改变。)之后。当执行到发射信号的代码时,钱数已经增加,而存货数量还没有减少。由于前面进行信号槽连接时没有指定连接方式,因此使用的是默认的自动连接模式,信号与信号槽本身又处于同一线程,在这种情况下,得到的是一個直接连接,也就是说信号槽在发射信号的语句执行时立即被调用。于是“更新资产”信号槽在存货数量还没有减少时便被调用,相当于将“卖出”的那么多的数量的商品再加咯一次。

验证咯一下,将发射信号的代码放到函数最后,变成下面的代码之后就计算正常咯:

/*!

*@brief 卖出当前货物。

*@param Good2Sell 当前要卖出的货物。

*/

void ShangHaiYanMoJi::SellGood(Good * Good2Sell)

{

QSpinBox * CrtSellSpinBox=0; //当前商品的卖出数量旋转框。

qint32 CrtPrice=0; //当前商品的价格。

Good * CrtGood=0; //当前商品。

qint32 EarnedMoney=0; //此次赚到的钱。

qint32 CrtAvePrice=0; //当前商品的平均进价。

CrtGood=Good2Sell; //当前商品的指针。

CrtPrice=CrtGood->GetPrice(); //获取当前商品的价格。

CrtSellSpinBox=CrtGood->GetSellSpinBox(); //获取卖出数量旋转框的指针。

if (CrtSellSpinBox->value()) //真正卖出咯东西,则进行结算。

{

CrtAvePrice=CrtGood->GetAvePrice(); //获取平均进价。

EarnedMoney=CrtSellSpinBox->value()*(CrtPrice-CrtAvePrice); //计算出赚到的钱数。

Money+=CrtSellSpinBox->value()*CrtPrice; //更新钱数。

if (EarnedMoney>=0) //记录利润。

{

CrtGood->AddProfit(EarnedMoney); //记录利润。

} //if

else //记录亏损。

{

CrtGood->AddLose(EarnedMoney); //记录亏损。

} //else

CrtGood->AddTradeAmount(CrtSellSpinBox->value()); //记录交易量。

CrtGood->SubAmount(CrtSellSpinBox->value()); //减少存货。出货。

// CrtSellSpinBox->setMaximum(CrtSellSpinBox->maximum()-CrtSellSpinBox->value()); //设置新的最大值,这是在当前情况下能卖的商品个数。

// CrtAmountLcd=CrtGood->GetAmountLcd(); //获取商品存货数量二极管。

// CrtAmountLcd->display(CrtSellSpinBox->maximum()); //显示存货数量。

// ComputeBuySell(); //计算能买卖的货的个数。

//取出视口的矩形,将这个矩形向下移动一段距离,距离的值为当前滚动条的值。产生一个新的矩形,这个新的矩形就是用户当前实际看到的区域。

QRect CrtRect=ui->PlayScrollArea->viewport()->rect(); //取得视口的矩形。

CrtRect.moveTop(ui->PlayScrollArea->verticalScrollBar()->value()); //移动矩形。

qDebug() << __FILE__ << __LINE__ << __func__ << tr(“Scroll area height:”) << ui->PlayScrollArea->height(); //Debug.

qDebug() << __FILE__ << __LINE__ << __func__ << tr(“Scroll area widget height:”) << ui->PlayScrollArea->widget()->height(); //Debug.

if (Good2Sell->GetFrame()) //框架存在。

{

QuePourGold(Good2Sell); //将下泼金币动画添加到队列中。

PourGoldTimer.start(); //启动向下泼金币效果的定时器。

} //if

//创建“飞行文字”的队列:

QueFlyText(Good2Sell,EarnedMoney); //将飞行文字效果添加到队列中。

FlyTextTimer.start(); //启动飞行文字效果的定时器。

if (EarnedMoney>0) //是赚咯钱,则显示庆祝视频。

{

ShowCelibVideo(Good2Sell); //显示庆祝视频。

} //if

emit MoneyChanged(Money); //钱数已经改变。

} //if

return;

} //void ShangHaiYanMoJi::SellGood(Good * Good2Sell)

理论支持:QT文档中说明的信号槽连接类型:

Qt4.8:Qt命名空间,Qt Namespace

类型文档

enum Qt::ConnectionType

这個枚举量描述的是信号与信号槽之间可采用的连接的类型。尤其是用来指明某個信号是应当立即传递到信号槽中还是排队等待稍后传递。

常量

描述

Qt::AutoConnection

0

(默认)如果该信号是从一個与接收对象所处的线程不同的线程中发射的,则信号會被排队,其行为就像Qt::QueuedConnection一样。否则,该信号槽會立即被调用,其行为就像Qt::DirectConnection 一样。连接类型會在信号被发射时决定。

Qt::DirectConnection

1

当信号被发射时,信号槽會立即被调用。

Qt::QueuedConnection

2

当控件权转移到接收者的线程中的事件循环时,信号槽會被调用。信号槽是在接收者的线程中执行的。

Qt::BlockingQueuedConnection

4

与QueuedConnection 类似,但是当前线程會阻塞,直到信号槽返回为止。只有在发射者与接收者处于不同的线程时,才能使用这种连接类型。注意:如果不遵守这個规则,那么可能导致妳的程序死锁。

Qt::UniqueConnection

0×80

与AutoConnection 类似,但是只有在这個连接不會与已有的连接重复时才會建立。也就是说,如果相同的信号与信号槽已经在相同的一对对象之间连接起来,那么这次的连接将會失败。这個连接类型是从Qt 4.6 开始引入的。

Qt::AutoCompatConnection

3

如果启用咯Qt 3 支持,则这個會是默认的连接类型。与AutoConnection 类似,但是在某些情况下會导致输出警告信息。参考兼容性信号和信号槽(Compatibility Signals and Slots)以了解更多信息。

对于排队式连接,其参数必须是 Qt 的元对象系统认识的类型,因为Qt 需要复制这些参数并且将它们在后台的事件中储存。如果妳尝试使用一個排队式连接而碰到这样的错误信息的话:

QObject::connect: Cannot queue arguments of type ‘MyType’

那么就在建立连接之前调用qRegisterMetaType()来注册一下这种数据类型。

如果想在跨线程使用信号和信号槽的话,参考一下跨线程的信号和信号槽(Signals and Slots Across Threads)

参考Qt中的线程支持QObject::connect()qRegisterMetaType()

Permanent link to this article: http://stupidbeauty.com/ShangHaiYanMoJi/2012/02/%e5%af%b9qt%e4%b8%ad%e4%bf%a1%e5%8f%b7%e6%a7%bd%e8%bf%9e%e6%8e%a5%e4%ba%86%e8%a7%a3%e4%b8%8d%e5%a4%9f%e5%af%bc%e8%87%b4%e9%80%bb%e8%be%91%e9%94%99%e8%af%af/

04 2012

转载:Qt获取组合键

- no title specified


转载:Qt获取组合键

表示键盘上的“Ctrl”键的常量是Qt::ControlModifier。

http://cool.worm.blog.163.com/blog/static/643390062009614248349/

亮点:

键盘按住Ctrl+ 鼠标左键的实现

在窗体中相应mousePressEvent事件函数在其中检测Ctrl键是否按住即可。

void Window::mousePressEvent(QMouseEvent *e)
{
//
获取鼠标在点击窗体上的坐标
QPoint pos = e->pos();
if (e->button() == LeftButton)
{
if ( QApplication::keyboardModifiers () == Qt::ControlModifier)
{
//pressed
}
}
}

Permanent link to this article: http://stupidbeauty.com/ShangHaiYanMoJi/2012/02/%e8%bd%ac%e8%bd%bd%ef%bc%9aqt%e8%8e%b7%e5%8f%96%e7%bb%84%e5%90%88%e9%94%ae/

十一 13 2011

Qt has caught an exception thrown from an event handler. Throwing exceptions from an event handler is not supported in Qt. You must reimplement QApplication::notify() and catch all exceptions there. terminate called after throwing an instance of ‘std::bad_alloc’ what(): std::bad_alloc


Qt has caught an exception thrown from an event handler. Throwing exceptions from an event handler is not supported in Qt. You must reimplement QApplication::notify() and catch all exceptions there. terminate called after throwing an instance of ‘std::bad_alloc’ what(): std::bad_alloc

在qt写的程序中如果有异常抛出而没有代码捕捉时,最终会被Qt的事件循环捕捉。要想知道到底是哪里抛出的异常,可使用gdb调试,让gdb对“抛出异常”这一情形设置断点,这样,一旦有异常抛出,gdb就会中断程序的运行咯。作为一个图形界面主义者,我不喜欢用命令行进行操作,而QtCreator就让这个过程变得简单咯。在“调试”模式的“断点”视图里单击鼠标右键,“添加断点”,再在“断点类型”里选择“中断 当C++ Exception被抛出”,再确定,就添加好断点咯。再开始调试,出现问题之后就会中断在抛出异常的地方咯。

今天就用这个方式找出咯代码中的一处错误,某個未初始化的整数引起一个整数数组变得巨大,向其中再加入整数元素时因为无法再分配连续的内存块而放弃。

还是没有在代码中加入异常处理的习惯啊。

参考:http://blog.cberger.net/2010/02/24/how-to-find-where-an-exception-is-emited-with-qt/

Permanent link to this article: http://stupidbeauty.com/ShangHaiYanMoJi/2011/11/qt-has-caught-an-exception-thrown-from-an-event-handler-throwing-exceptions-from-an-event-handler-is-not-supported-in-qt-you-must-reimplement-qapplicationnotify-and-catch-all-exceptions-there-t/

十一 10 2011

Qt4.7文档翻译:QEvent类参考,QEvent Class Reference


Qt4.7文档翻译:QEvent类参考,QEvent Class Reference

成员类型文档

enum QEvent::Type

这个枚举定义的是Qt中有效的事件类型。每种类型的事件的类型及对应的类在以下列出:

常量

说明

QEvent::None

0

不是事件。

QEvent::AccessibilityDescription

130

用来查询辅助功能(accessibility)说明文字(QAccessibleEvent)。

QEvent::AccessibilityHelp

119

用来查询辅助功能帮助文字(QAccessibleEvent)。

QEvent::AccessibilityPrepare

86

出现咯辅助信息请求。

QEvent::ActionAdded

114

添加咯一个新的动作(QActionEvent)。

QEvent::ActionChanged

113

某个动作被改变咯(QActionEvent)。

QEvent::ActionRemoved

115

某个动作被删除咯(QActionEvent)。

QEvent::ActivationChange

99

某个部件的顶级窗口的活动状态发生咯改变。

QEvent::ApplicationActivate

121

本程序被激活。

QEvent::ApplicationActivated

ApplicationActivate

这个枚举量已经废弃。使用ApplicationActivate 来代替。

QEvent::ApplicationDeactivate

122

本程序被挂起,因此用户无法操作它。

QEvent::ApplicationFontChange

36

程序的默认字体发生改变。

QEvent::ApplicationLayoutDirectionChange

37

程序的默认布局方向发生改变。

QEvent::ApplicationPaletteChange

38

程序的默认调色板发生改变。

QEvent::ApplicationWindowIconChange

35

程序的图标发生改变。

QEvent::ChildAdded

68

某个对象喜添贵子(子对象)(QChildEvent)。

QEvent::ChildInserted

70

某个对象喜添贵子(QChildEvent)。仅用于Qt3支持Qt3Support,在Qt4中请使用ChildAdded。

QEvent::ChildPolished

69

某个子代部件被美化(polished)(QChildEvent)。

QEvent::ChildRemoved

71

某个对象不幸丧子(失去一个子对象)(QChildEvent)。

QEvent::Clipboard

40

剪贴板内容发生改变(QClipboardEvent)。

QEvent::Close

19

部件被关闭(QCloseEvent)。

QEvent::CloseSoftwareInputPanel

200

某个部件想要关闭软键盘(software input panel)(SIP)。

QEvent::ContentsRectChange

178

某个部件的内容区域(content rect)的边距(margins)发生改变。

QEvent::ContextMenu

82

上下文弹出式菜单(QContextMenuEvent)。

QEvent::CursorChange

183

某个部件的鼠标光标发生改变。

QEvent::DeferredDelete

52

当这个部件做完清理工作之后,会被删除。

QEvent::DragEnter

60

鼠标光标在一个拖放操作中进入某个部件(QDragEnterEvent)。

QEvent::DragLeave

62

鼠标光标在一个拖放操作中离开某个部件(QDragEnterEvent)。

QEvent::DragMove

61

正在发生某个拖放操作(QDragMoveEvent)。

QEvent::Drop

63

某个拖放操作进行完毕(QDropEvent)。

QEvent::EnabledChange

98

某个部件的启用状态发生改变。

QEvent::Enter

10

鼠标进入某个部件的边界(boundaries)。

QEvent::EnterEditFocus

150

某个编辑部件获取咯编辑焦点。

QEvent::EnterWhatsThisMode

124

当程序进入“这是什么?”(”What’s This?”)模式时,會向顶级部件发送这个事件。

QEvent::FileOpen

116

请求打开文件(QFileOpenEvent)。

QEvent::FocusIn

8

某个部件获得咯键盘焦点(QFocusEvent)。

QEvent::FocusOut

9

某个部件失去咯键盘焦点(QFocusEvent)。

QEvent::FontChange

97

某个部件的字体发生改变。

QEvent::GrabKeyboard

188

某个条目(Item)掌握咯键盘(仅支持QGraphicsItem)。

QEvent::GrabMouse

186

某个条目掌握咯鼠标(仅支持QGraphicsItem)。

QEvent::GraphicsSceneContextMenu

159

在某个图形场景(graphics scene)中弹出上下文菜单(QGraphicsSceneContextMenuEvent)。

QEvent::GraphicsSceneDragEnter

164

鼠标在某个拖放操作中进入一个图形场景(QGraphicsSceneDragDropEvent)。

QEvent::GraphicsSceneDragLeave

166

鼠标在某个拖放操作中离开一个图形场景(QGraphicsSceneDragDropEvent)。

QEvent::GraphicsSceneDragMove

165

在某个场景上方正发生着一个拖放操作(QGraphicsSceneDragDropEvent)。

QEvent::GraphicsSceneDrop

167

在某个场景上方,一个拖放操作执行完毕(QGraphicsSceneDragDropEvent)。

QEvent::GraphicsSceneHelp

163

用户请求对某个图形场景给出帮助信息(QHelpEvent)。

QEvent::GraphicsSceneHoverEnter

160

鼠标光标进入某个图形场景中的一个悬停条目(QGraphicsSceneHoverEvent)。

QEvent::GraphicsSceneHoverLeave

162

鼠标光标离开某个图形场景中的一个悬停条目(QGraphicsSceneHoverEvent)。

QEvent::GraphicsSceneHoverMove

161

鼠标光标在某个图形场景中的一个悬停条目里移动(QGraphicsSceneHoverEvent)。

QEvent::GraphicsSceneMouseDoubleClick

158

在一个图形场景中第二次点击(双击)鼠标(QGraphicsSceneMouseEvent)。

QEvent::GraphicsSceneMouseMove

155

在某个图形场景中移动鼠标(QGraphicsSceneMouseEvent)。

QEvent::GraphicsSceneMousePress

156

在某个图形场景中点击鼠标(QGraphicsSceneMouseEvent)。

QEvent::GraphicsSceneMouseRelease

157

在某个图形场景中松开鼠标(QGraphicsSceneMouseEvent)。

QEvent::GraphicsSceneMove

182

部件移动咯位置(QGraphicsSceneMoveEvent)。

QEvent::GraphicsSceneResize

181

部件改变咯大小(QGraphicsSceneResizeEvent)。

QEvent::GraphicsSceneWheel

168

在某个图形场景中滚动咯鼠标滚轮(QGraphicsSceneWheelEvent)。

QEvent::Hide

18

某个部件被隐藏(QHideEvent)。

QEvent::HideToParent

27

某个子代部件被隐藏。

QEvent::HoverEnter

127

鼠标进入某个悬停部件(QHoverEvent)。

QEvent::HoverLeave

128

鼠标离开某个悬停部件(QHoverEvent)。

QEvent::HoverMove

129

鼠标在某个悬停部件中移动(QHoverEvent)。

QEvent::IconDrag

96

某个窗口的主图标被拖走(QIconDragEvent)。

QEvent::IconTextChange

101

某个部件的图标文字发生改变。

QEvent::InputMethod

83

正在使用某个输入法(QInputMethodEvent)。

QEvent::KeyPress

6

按键被按(QKeyEvent)。

QEvent::KeyRelease

7

按键被松开(QKeyEvent)。

QEvent::LanguageChange

89

程序的翻译内容发生改变。

QEvent::LayoutDirectionChange

90

布局器的方向发生改变。

QEvent::LayoutRequest

76

某个部件的布局需要重新计算。

QEvent::Leave

11

鼠标离开某个部件的边界。

QEvent::LeaveEditFocus

151

某个编辑部件失去咯编辑焦点。

QEvent::LeaveWhatsThisMode

125

当程序离开“这是什么?”模式时,會发送这个事件给顶级部件。

QEvent::LocaleChange

88

系统的语言区域发生改变。

QEvent::NonClientAreaMouseButtonDblClick

176

在客户区域以外的地方发生鼠标双击。

QEvent::NonClientAreaMouseButtonPress

174

在客户区域以外的地方按下鼠标。

QEvent::NonClientAreaMouseButtonRelease

175

在客户区域以外的地方松开鼠标。

QEvent::NonClientAreaMouseMove

173

在客户区域以外的地方移动鼠标。

QEvent::MacSizeChange

177

用户改变咯部件的大小(仅用于Mac OS X)。

QEvent::MenubarUpdated

153

窗口的菜单栏被更新。

QEvent::MetaCall

43

通过QMetaObject::invokeMethod()进行一次异步方法调用。

QEvent::ModifiedChange

102

部件的修改状态发生改变。

QEvent::MouseButtonDblClick

4

再次按下鼠标(QMouseEvent)。

QEvent::MouseButtonPress

2

按下鼠标(QMouseEvent)。

QEvent::MouseButtonRelease

3

松开鼠标(QMouseEvent)。

QEvent::MouseMove

5

移动鼠标(QMouseEvent)。

QEvent::MouseTrackingChange

109

鼠标跟踪状态发生改变。

QEvent::Move

13

部件的位置发生改变(QMoveEvent)。

QEvent::Paint

12

有必要刷新屏幕(QPaintEvent)。

QEvent::PaletteChange

39

某个部件的调色板发生改变。

QEvent::ParentAboutToChange

131

这个部件的亲代部件准备发生改变。

QEvent::ParentChange

21

这个部件的亲代部件已经发生改变。

QEvent::Polish

75

这个部件被美化。

QEvent::PolishRequest

74

这个部件应当被美化。

QEvent::QueryWhatsThis

123

如果这个部件拥有“这是什么?”帮助信息的话,那么它应当接受这个事件。

QEvent::RequestSoftwareInputPanel

199

某个部件想要打开一个软键盘(SIP)。

QEvent::Resize

14

某个部件的大小发生改变(QResizeEvent)。

QEvent::Shortcut

117

在子代部件中按下按键,以触发快捷键效果(QShortcutEvent)。

QEvent::ShortcutOverride

51

在子代部件中按下按键,以修改快捷键(QKeyEvent)。

QEvent::Show

17

某个部件被显示到屏幕上(QShowEvent)。

QEvent::ShowToParent

26

某个子代部件被显示出来。

QEvent::SockAct

50

套接字被激活,用来实现QSocketNotifier

QEvent::StateMachineSignal

192

某个信号被传递给一个状态机(QStateMachine::SignalEvent)。

QEvent::StateMachineWrapped

193

这个事件是另一个事件的包装,也就是说,它包含另一个事件(QStateMachine::WrappedEvent)。

QEvent::StatusTip

112

请求获取一个状态提示(QStatusTipEvent)。

QEvent::StyleChange

100

某个部件的样式发生改变。

QEvent::TabletMove

87

Wacom绘图板移动(QTabletEvent)。

QEvent::TabletPress

92

Wacom绘图板按压(QTabletEvent)。

QEvent::TabletRelease

93

Wacom绘图板松开(QTabletEvent)。

QEvent::OkRequest

94

装饰中的确定按钮被按下。仅支持Windows CE。

QEvent::TabletEnterProximity

171

Wacom绘图板进入近似模式(proximity)(QTabletEvent),被发送给QApplication

QEvent::TabletLeaveProximity

172

Wacom绘图板离开近似模式(proximity)(QTabletEvent),被发送给QApplication

QEvent::Timer

1

常规定时器事件(QTimerEvent)。

QEvent::ToolBarChange

120

在 Mac OS X 上,工具条上的按钮被切换。

QEvent::ToolTip

110

请求弹出工具提示(QHelpEvent)。

QEvent::ToolTipChange

184

这个部件的工具提示发生改变。

QEvent::UngrabKeyboard

189

某个条目不再抓取键盘(仅支持QGraphicsItem)。

QEvent::UngrabMouse

187

某个条目不再抓取鼠标(仅支持QGraphicsItem)。

QEvent::UpdateLater

78

这个部件应当放入到队列中以便稍后重绘。

QEvent::UpdateRequest

77

这个部件应当被重绘。

QEvent::WhatsThis

111

这个部件应当显示“这是什么?”帮助信息(QHelpEvent)。

QEvent::WhatsThisClicked

118

在某个部件的“这是什么?”帮助信息中的某个链接被点击咯。

QEvent::Wheel

31

鼠标滚轮滚动咯(QWheelEvent)。

QEvent::WinEventAct

132

出现咯一个仅限于Windows 系统的激活事件。

QEvent::WindowActivate

24

窗口被激活。

QEvent::WindowBlocked

103

这个窗口被某个模态对话框阻塞。

QEvent::WindowDeactivate

25

窗口变成非活动的咯。

QEvent::WindowIconChange

34

这个窗口的图标发生改变。

QEvent::WindowStateChange

105

这个窗口的状态(最小化、最大化或者全屏)发生改变(QWindowStateChangeEvent)。

QEvent::WindowTitleChange

33

这个窗口的标题发生改变。

QEvent::WindowUnblocked

104

某个模态对话框退出之后,这个窗口不再被阻塞。

QEvent::ZOrderChange

126

这个部件的z顺序发生改变。这个事件永远不会发送到顶级窗口。

QEvent::KeyboardLayoutChange

169

键盘布局发生改变。

QEvent::DynamicPropertyChange

170

某个动态属性被添加到这个对象,或者这个对象的某个动态属性被改变,或者这个对象的某个动态属性被删除。

QEvent::TouchBegin

194

一连串的触摸屏和/或轨迹板事件的开始(QTouchEvent)。

QEvent::TouchUpdate

195

触摸屏事件(QTouchEvent)。

QEvent::TouchEnd

196

触摸屏事件序列的结束(QTouchEvent)。

QEvent::WinIdChange

203

这个原生部件的窗口系统标识符发生改变。

QEvent::Gesture

198

某个手势被触发(QGestureEvent)。

QEvent::GestureOverride

202

某个手势被重置(override)(QGestureEvent)。

用户自定义的事件的值应当介于UserMaxUser之间:

常量

描述

QEvent::User

1000

用户定义的事件。

QEvent::MaxUser

65535

最后一个可用的用户定义事件的标识符。

为咯方便起见,你可以使用registerEventType()函数来为你的程序注册并占有一个自定义的事件类型。这样做有一个好处,可以避免你把程序中另一个地方已经在使用的自定义事件类型拿来重复使用。

Permanent link to this article: http://stupidbeauty.com/ShangHaiYanMoJi/2011/11/qt4-7%e6%96%87%e6%a1%a3%e7%bf%bb%e8%af%91%ef%bc%9aqevent%e7%b1%bb%e5%8f%82%e8%80%83qevent-class-reference/

十一 09 2011

Qt4.7文档翻译:QCoreApplication类参考,QCoreApplication Class Reference


Qt4.7文档翻译:QCoreApplication类参考,QCoreApplication Class Reference

成员函数文档

void QCoreApplication::installTranslator ( QTranslator * translationFile ) [static]

将翻译文件translationFile添加到将用于翻译的翻译文件列表中。

可安装多个翻译文件。翻译文件是按照与它们所安装的顺序相反的顺序被用来搜索的,∴最后安装的翻译文件将最先被搜索,而第一个安装的翻译文件将会最后被搜索。一旦找到一个匹配的翻译项,搜索过程立即停止。

安装或者删除某個QTranslator,或者是改变某個已安装的QTranslator,都会对QCoreApplication实例产生一个LanguageChange事件。QApplication的实例會将这個事件传播给所有的顶级窗口,在那里,一個重载的changeEvent 會通过使用tr()函数将用户可见的字符串传递给对应的属性设置器的方式来重新翻译用户界面。由Qt设计师(Qt Designer)生成的用户界面类提供咯一個可被调用的retranslateUi()函数。

参考removeTranslator()、translate()、QTranslator::load()动态翻译

Permanent link to this article: http://stupidbeauty.com/ShangHaiYanMoJi/2011/11/qt4-7%e6%96%87%e6%a1%a3%e7%bf%bb%e8%af%91%ef%bc%9aqcoreapplication%e7%b1%bb%e5%8f%82%e8%80%83qcoreapplication-class-reference/

11 2011

Qt4.7文档翻译:QTimeLine类参考,QTimeLine Class Reference

- no title specified


Qt4.7文档翻译:QTimeLine类参考,QTimeLine Class Reference

属性文档

loopCount : int

这个属性储存的是这个时间线在结束之前的循环次数。

循环次数为0的话就表示这个时间线会一直循环下去,直到天荒地老。

默认情况下,这个属性的值是1.

访问函数

int

loopCount () const

void

setLoopCount ( int count )

Permanent link to this article: http://stupidbeauty.com/ShangHaiYanMoJi/2011/09/qt4-7%e6%96%87%e6%a1%a3%e7%bf%bb%e8%af%91%ef%bc%9aqtimeline%e7%b1%bb%e5%8f%82%e8%80%83qtimeline-class-reference/

09 2011

Qt4.7文档翻译:QTimer类参考,QTimer Class Reference

- no title specified


Qt4.7文档翻译:QTimer类参考,QTimer Class Reference

属性文档

interval : int

这个属性保存的是超时时间间隔,以毫秒为单位。

这个属性的默认值是0。一个超时时间间隔为 0 的QTimer会在窗口系统的事件队列中所有的事件被处理完毕之后立即超时。

设置一个活动的定时器的时间间隔的话,会改变它的定时器编号(timerId())。

访问函数

int

interval () const

void

setInterval ( int msec )

参见singleShot