2010-01-06 2 views
1

Когда я нажимаю кнопку в главном окне, я хочу, чтобы она стала прозрачной для событий клавиатуры и мыши, т.е. все события клавиатуры и мыши должны проходить в любое окно под ним, как если бы это окно не было данный бывает.Прозрачный виджет клавиатуры и мыши-событий

Qt::WA_TransparentForMouseEvents здесь не работает, так как это только делает дочерние окна прозрачными для событий клавиатуры и мыши, я думаю. И мое окно - главное окно, и я хочу передать все события в любое окно на рабочем столе, а не только в родительском окне.

+0

Точный дубликат: http://stackoverflow.com/questions/987019/qt-top-level-widget-with-keyboard-and-mouse-event-transparency –

ответ

2

В моем приложении используется Qt::WA_TransparentForMouseEvents, и он отлично работает.

Я не понимаю проблему, с которой вы столкнулись, но она должна работать. Если у вас все еще есть проблема setattribute на Qt::WA_TransparentForMouseEvents и Qt::WA_Translucentbackground.

+0

еще у когда-либо использовал "WS_EX_TRANSPARENT" в MFC , я хочу нечто подобное. делает это (Qt :: WA_TransparentForMouseEvents) делает make прозрачным для мыши событие мыши и отправит все дочерние события родительскому, но что, если мое окно, которое я хочу сделать прозрачным для мыши, является окном верхнего уровня или скажем, это мое главное окно. этот флаг, похоже, не работает. При использовании setWindowOpacity (0.0) все события проходят через него, но проблема даже в том, что когда-либо я рисую на ней, также становится невидимой (прозрачное окно), но я хочу, чтобы на ней были видимы рисунки, Это. – Gajender

2

Вот пример кода, который позволяет мне делать рисование, и все еще события мыши проходят через него.

Sample::Sample(QWidget *pParent):QWidget(pParent) 
{ 
    setAttribute(Qt::WA_TranslucentBackground); 
    setAttribute(Qt::WA_TransparentForMouseEvents); 
    setWindowFlags(Qt::FramelessWindowHint); 
    QDesktopWidget qDesktopWidget; 
    QRect screenSize = qDesktopWidget.screenGeometry(); 
    setGeometry(screenSize); 
} 

Sample::~Sample() 
{ 
} 

void Sample::paintEvent(QPaintEvent*) 
{ 
    QDesktopWidget new QDesktopWidget(); 
    QRect rectangle = qDesktopWidget->screenGeometry(); 
    setGeometry(rectangle); 

    const QPoint points[5] = { 
     QPoint(0, 20), 
     QPoint(rectangle.width(), 20), 
     QPoint(rectangle.width(), rectangle.height()), 
     QPoint(0,rectangle.height()), 
     QPoint(0, 0) 
    }; 

    QPen pen(Qt::blue, 10, Qt::SolidLine, Qt::SquareCap); 
    QPainter painter(this); 
    painter.setPen(pen); 
    painter.drawPolyline(points, 5); 
    painter.end(); 
} 
+0

Rahul, что вы сделали здесь, сделал полупрозрачное окно, даже если мы не установили флаг прозрачностиForMouse, а также события мыши, но когда мы установили флаг «WindowStaysOnTopHint», прозрачность исчезнет. и еще одна проблема заключается в том, что он просто дает прозрачность мыши для области, которая прозрачна не для полного окна, а рисованная область по-прежнему имеет мышь. Такое поведение может быть достигнуто с помощью SetMask() в виджетах и ​​с использованием альфа-смешанного изображения. , но я хочу, чтобы все события проходили, клавиатурная мышь и all.drawing всегда были видны пользователю, в окне ур-фрейма также идет фон. – Gajender