2014-04-08 5 views
1

Qt4 QPushButtonQMenu과 함께 사용합니다 (setMenu()으로 설정). 관련없는 이벤트가 발생하면이 메뉴를 표시해야합니다.차단하지 않고 QPushButton에서 메뉴를 표시하는 방법?

방법 QPushButton::showMenu()은이 작업을 수행하지만 사용자가 메뉴를 닫을 때까지 차단합니다. QMenu::show()도이 작업을 수행하지만 화면의 왼쪽 상단에 메뉴를 표시합니다.

프로그래밍 방식으로 메뉴를 올바르게 배치하고 차단하지 않고 표시 할 수 있습니까?

답변

0

QMenuQWidget입니다. 따라서 show() 전에 move()으로 전화 할 수 있습니다. 액션 atAction 지정된 글로벌 위치 p에 될 수 있도록

0

당신은

void QMenu::popup (const QPoint & p, QAction * atAction = 0) 

그래서

표시 메뉴를 사용할 수 있습니다. 위젯의 로컬 좌표를 전역 좌표로 변환하려면 QWidget :: mapToGlobal()을 사용하십시오.

0

아니요, QPushButton이 호출자가 아닌 메뉴 위치를 관리해야하기 때문에 제안 된 솔루션이 마음에 들지 않았습니다.

그래서이 QPushButton 위젯에 마우스 down/up 이벤트를 게시하여 사용자가 수행하는 것을 시뮬레이션하기로 결정했습니다. 이것은 트릭을했다. 이것은 Qt에서 누락 된 기능을 보완하기위한 해킹입니다.

void simulateMouseClick(QWidget *widget) { 
    QPoint pos(widget->width()/2, widget->height()/2); 
    QMouseEvent *evtDown = new QMouseEvent(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); 
    QMouseEvent *evtUp = new QMouseEvent(QEvent::MouseButtonRelease, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); 
    (void) QApplication::postEvent(widget, evtDown); 
    (void) QApplication::postEvent(widget, evtUp); 
}