2017-10-10 89 views
0

我在Qt 5.9中构建一个需要在X11显示器上运行的UI。我正在尝试将阴影添加到我的对话窗口 - 但它们不能在X11上工作。如何通过X11获取Qt透明胶片? (或另一种方式使X11的影子工作)

我采取的方法是从zeFree的回答This Question。 (将所有内容放在窗口中,将窗口设置为半透明,并在窗口小部件上创建阴影效果)。

setAttribute(Qt::WA_TranslucentBackground); //enable Window to be transparent 

QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect(); 
effect->setBlurRadius(5); 
ui->widget->setGraphicsEffect(effect); 

它在我的红帽虚拟机的伟大工程:

RedHat Dropshadow

但是,当我发送到X11显示我,它看起来像透明性不支持,而且我上阴影黑色,而不是:

X11 Dropshadow

我的问题是:是否有办法来调整我的Qt使运行该应用程序通过X11显示屏显示将正确显示我的透明胶片?

最终,任何导致X11显示屏上工作投影的建议都会很棒!

+0

你有合成窗口管理器吗?这是这种部分透明度的先决条件。 –

+0

不幸的是我不知道。我的目标显示器是具有IP和一些未知窗口管理器的Esterline显示器。我在redhat 7.3上免费获得的所有奇特Qt窗口样式在此显示中都没有。 – spickesj

+0

如果你不能选择窗口管理器,那么很可惜你很可能会失去运气。 –

回答

0

要解决此问题,我最终使用下面的函数在主窗口上制作阴影对象。 (它将窗口放在屏幕中间并构建阴影对象)然后,当我显示并隐藏窗口时,我在阴影对象上执行 - > show()和 - > hide()。这有点混乱 - 但它是我发现的通过X11在这个特定的触摸屏上工作的唯一解决方案。

QPushButton * MainWindow::positionAndShadow(QDialog* window) 
{ 
    int xpos = SCREEN_RES_H/2 - window->size().width()/2; 
    int ypos = SCREEN_RES_V/2 - window->size().height()/2; 
    if (ypos - 10 > 0) 
    { 
     ypos -= 10; 
    } 
    window->setGeometry(xpos,ypos,window->size().width(),window->size().height()); 

    QPushButton* shadow = new QPushButton(this); 
    shadow->setEnabled(false); 
    shadow->setGeometry(xpos,ypos,window->size().width(),window->size().height()); 

    QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect(); 
    effect->setColor(QColor(40, 40, 40, 220)); 
    effect->setBlurRadius(15); 
    shadow->setGraphicsEffect(effect); 
    shadow->hide(); 

    return shadow; 
}