• 5053阅读
  • 0回复

用鼠标绘制窗口的问题: [复制链接]

上一主题 下一主题
离线vaqeteart
 

只看楼主 倒序阅读 楼主  发表于: 2009-12-15
大家好,
目前我正在写一个程序,这个代码实际是qtExtend中的
src/3rdparty/plugins/inputmethods/pkim这个插件,功能是全屏幕手写。
我的目的是想去掉手写的全屏幕功能,我的思路是首先将那个全屏幕的“透明”窗口改成不透明的,然后改变窗口大小。
代码很多,也没有办法全贴出来,这里只贴关键的部分:
  1. QWSScreenStroke::QWSScreenStroke() :
  2.     QWidget(0, Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint)
  3.     , lastPoint(0,0)
  4.     , currentStroke(false)
  5.     , currentStrokePoints()
  6.     , fullScreenClearFlag(false)
  7.     , fadedStrokePoints()
  8.     , oldFadedStrokeRect()
  9.     , fadeStrokeFlag(false)
  10.     , compositionModesSupported(-1)
  11. {
  12.     QRect desktopAvailableRect(QApplication::desktop()->availableGeometry());
  13.     setPalette(QPalette(QColor(0,0,0,0)));
  14.     setAttribute(Qt::WA_NoSystemBackground);
  15.     setWindowOpacity(0.0);
  16.     setFixedSize(desktopAvailableRect.size());
  17.     qLog(Input) << "QWSScreenStroke being instantiated with geometry" << desktopAvailableRect;
  18.     setGeometry(desktopAvailableRect);
  19.     setFocusPolicy(Qt::NoFocus);
  20. }

这段代码是设置初始窗口的,
目前我的问题是:
去掉setAttribute(Qt::WA_NoSystemBackground);
程序崩溃,这样就导致无法更改窗口颜色了。
修改的代码如下:
  1. QWSScreenStroke::QWSScreenStroke() :
  2.     QWidget(0, Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint)
  3.     , lastPoint(0,0)
  4.     , currentStroke(false)
  5.     , currentStrokePoints()
  6.     , fullScreenClearFlag(false)
  7.     , fadedStrokePoints()
  8.     , oldFadedStrokeRect()
  9.     , fadeStrokeFlag(false)
  10.     , compositionModesSupported(-1)
  11. {
  12.     QRect desktopAvailableRect(QApplication::desktop()->availableGeometry());
  13.     //setPalette(QPalette(QColor(0,0,0,0)));
  14.     setPalette(QPalette(QColor(127,127,127)));
  15.     //setAttribute(Qt::WA_NoSystemBackground);
  16.     //setWindowOpacity(0.0);
  17.     setWindowOpacity(1.0);
  18.     setFixedSize(desktopAvailableRect.size());
  19.     qLog(Input) << "QWSScreenStroke being instantiated with geometry" << desktopAvailableRect;
  20.     setGeometry(desktopAvailableRect);
  21.     setFocusPolicy(Qt::NoFocus);
  22. }


正常来说,一般简单的程序,这样应该就可以改变窗口颜色了。问题是这个程序太复杂了,我知道原因肯定在setAttribute(Qt::WA_NoSystemBackground);这句话中,程序不能没有这句话,我注释掉这句话就会程序崩溃,
我的目的实际就是想知道,如果一个和绘制有关的程序,去掉窗口属性设置:setAttribute(Qt::WA_NoSystemBackground);这句话,程序就会崩溃,那么可能的原因是什么呢?
谢谢大家!!
快速回复
限100 字节
 
上一个 下一个