大家好,
目前我正在写一个程序,这个代码实际是qtExtend中的
src/3rdparty/plugins/inputmethods/pkim这个插件,功能是全屏幕手写。
我的目的是想去掉手写的全屏幕功能,我的思路是首先将那个全屏幕的“透明”窗口改成不透明的,然后改变窗口大小。
代码很多,也没有办法全贴出来,这里只贴关键的部分:
- QWSScreenStroke::QWSScreenStroke() :
- QWidget(0, Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint)
- , lastPoint(0,0)
- , currentStroke(false)
- , currentStrokePoints()
- , fullScreenClearFlag(false)
- , fadedStrokePoints()
- , oldFadedStrokeRect()
- , fadeStrokeFlag(false)
- , compositionModesSupported(-1)
- {
- QRect desktopAvailableRect(QApplication::desktop()->availableGeometry());
- setPalette(QPalette(QColor(0,0,0,0)));
- setAttribute(Qt::WA_NoSystemBackground);
- setWindowOpacity(0.0);
- setFixedSize(desktopAvailableRect.size());
- qLog(Input) << "QWSScreenStroke being instantiated with geometry" << desktopAvailableRect;
- setGeometry(desktopAvailableRect);
- setFocusPolicy(Qt::NoFocus);
- }
这段代码是设置初始窗口的,
目前我的问题是:
去掉setAttribute(Qt::WA_NoSystemBackground);
程序崩溃,这样就导致无法更改窗口颜色了。
修改的代码如下:
- QWSScreenStroke::QWSScreenStroke() :
- QWidget(0, Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint)
- , lastPoint(0,0)
- , currentStroke(false)
- , currentStrokePoints()
- , fullScreenClearFlag(false)
- , fadedStrokePoints()
- , oldFadedStrokeRect()
- , fadeStrokeFlag(false)
- , compositionModesSupported(-1)
- {
- QRect desktopAvailableRect(QApplication::desktop()->availableGeometry());
- //setPalette(QPalette(QColor(0,0,0,0)));
- setPalette(QPalette(QColor(127,127,127)));
- //setAttribute(Qt::WA_NoSystemBackground);
- //setWindowOpacity(0.0);
- setWindowOpacity(1.0);
- setFixedSize(desktopAvailableRect.size());
- qLog(Input) << "QWSScreenStroke being instantiated with geometry" << desktopAvailableRect;
- setGeometry(desktopAvailableRect);
- setFocusPolicy(Qt::NoFocus);
- }
正常来说,一般简单的程序,这样应该就可以改变窗口颜色了。问题是这个程序太复杂了,我知道原因肯定在setAttribute(Qt::WA_NoSystemBackground);这句话中,程序不能没有这句话,我注释掉这句话就会程序崩溃,
我的目的实际就是想知道,如果一个和绘制有关的程序,去掉窗口属性设置:setAttribute(Qt::WA_NoSystemBackground);这句话,程序就会崩溃,那么可能的原因是什么呢?谢谢大家!!