我需要确定我的Qt 4.4.1应用程序何时获得焦点.
我提出了两种可能的解决方案,但它们都不能完全按照我的意愿工作.
在第一个可能的解决方案中,我将来自qApp的focusChanged()信号连接到SLOT.在插槽中,我检查'旧'指针.如果它为'0',那么我知道我们已经切换到这个应用程序,我做我想做的事情.这似乎是让应用程序检测这里介绍的两个解决方案焦点的最可靠方法,但是遇到了下面描述的问题.
在第二种可能的解决方案中,我覆盖了'focusInEvent()'例程,如果原因是'ActiveWindowFocusReason',那就做我想要的.
在这两种解决方案中,代码都是在我不希望的时候执行的.
例如,我有这个代码覆盖focusInEvent()例程:
void
ApplicationWindow::focusInEvent( QFocusEvent* p_event )
{
Qt::FocusReason reason = p_event->reason();
if( reason == Qt::ActiveWindowFocusReason &&
hasNewUpstreamData() )
{
switch( QMessageBox::warning( this, "New Upstream Data Found!",
"New upstream data exists!\n"
"Do you want to refresh this simulation?",
"&Yes", "&No", 0, 0, 1 ) )
{
case 0: // Yes
refreshSimulation();
break;
case 1: // No
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
执行此操作时,将显示QMessageBox对话框.但是,当通过按"是"或"否"关闭对话框时,会立即再次调用此函数,因为我认为焦点在此时使用ActiveWindowFocusReason更改回应用程序窗口.显然我不希望这种情况发生.
同样,如果用户正在使用应用程序打开和关闭对话框和窗口等,我不希望激活此例程.注意:我不确定此例程被激活的情况,因为我已经尝试了一下,并且它不会发生在所有窗口和对话框中,尽管它至少发生在示例代码中显示的那个.
如果应用程序是从该应用程序外部关注的,而不是主窗口从其他对话框窗口聚焦,我只想激活它.
这可能吗?如何才能做到这一点?
感谢您提供任何信息,因为这对我们的应用程序非常重要.
雷蒙德.
我搜索并搜索了stackoverflow的答案,但还没找到我需要的东西.
我有一个例程,它将unsigned char数组作为参数,以便将其编码为Base64.我想在Base64中编码STL浮点向量(向量),因此需要将浮点向量中的字节重新解释为无符号字符数组,以便将其传递给编码例程.我已经尝试了很多东西,从重新解释和静态转换,到mem副本等,但它们似乎都没有工作(至少不是我实现它们的方式).
同样,在将编码数据解码回浮点数组时,我需要做相反的事情.解码例程将解码数据作为unsigned char数组提供,我将需要重新解释该字节数组,再次将其转换为浮点数.
这是我的C++代码的精简版本来进行编码:
std::string
EncodeBase64FloatVector( const vector<float>& p_vector )
{
unsigned char* sourceArray;
// SOMEHOW FILL THE sourceArray WITH THE FLOAT VECTOR DATA BITS!!
char* target;
size_t targetSize = p_vector.size() * sizeof(float);
target = new char[ targetSize ];
int result = EncodeBase64( sourceArray, floatArraySizeInUChars, target, targetSize );
string returnResult;
if( result != -1 )
{
returnResult = target;
}
delete target;
delete sourceArray;
return returnResult;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.谢谢.
雷蒙德.