Кликабельный пункт меню с подменю в Qt - PullRequest
0 голосов
/ 22 сентября 2010

Я пишу в Qt 4.6. Мне интересно, возможно ли достичь такого пункта меню, который можно вызвать, но также имеет подменю. Щелчок по нему запускает связанное действие, при наведении на него появляется подменю.

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

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

С учетом сказанного, однако, фактическая реализация не слишком сложна. Просто создайте подкласс QMenu, из которого вы создаете подменю, и переопределите обработчики событий, принудительно закрыв родительское меню, когда сделан «выбор». Что-то вроде следующего в основном работает:

from PyQt4 import QtCore, QtGui
import sys

app = QtGui.QApplication(sys.argv)
widget = QtGui.QMainWindow()
widget.resize(250,150)
menu = widget.menuBar().addMenu("test")

class submenu(QtGui.QMenu):                   #Override the submenu class
    def __init__(self,name):
        QtGui.QMenu.__init__(self,name)
    def mouseReleaseEvent(self,event):    #catch mouseRelease Events
        global menu
        QtGui.QMenu.mouseReleaseEvent(self,event)
        if not self.rect().contains(event.pos()):
            print("Parent Selected")
            menu.hide()                  #If the parent was selected, hide it
        else:                            #Likely ignore these
            print("Parent NOT Selected")

def c():
    print("Sub-item selected")
cMenu = submenu("Sub-menu")
menu.addMenu(cMenu)
actionC = QtGui.QAction("sub-item",widget)
actionC.triggered.connect(c)
cMenu.addAction(actionC)

widget.show()

sys.exit(app.exec_())
0 голосов
/ 26 сентября 2010

Это поведение немного сбивает с толку, но я пытаюсь разработать пользовательский интерфейс с минимальным количеством щелчков мышью.Хотя это немного неожиданно, такое поведение делает его немного быстрее, когда вы к нему привыкнете.

Я не писал этого в своем предыдущем сообщении, но я пишу на c ++, и понятия не имеюо питоне ... В любом случае мне удалось перевести идею на c ++, и она работает, но это довольно уродливо ... Я нашел немного лучший подход, просмотрев исходный код qt (когда я задавал этот вопрос, я надеялся, что есть что-то лучше,«предполагаемый» метод)

class MyMenu : public QMenu
{
Q_OBJECT
public:
    MyMenu(QWidget* parent);

    ~MyMenu();

    virtual void mouseReleaseEvent( QMouseEvent * event );

};

MyMenu::MyMenu(QWidget* parent):QMenu(parent)
{
}

MyMenu::~MyMenu()
{
}

void MyMenu::mouseReleaseEvent( QMouseEvent * event ){
  QAction* act = menuAction();
  if (act){
    QMenu* men = act->menu();
    act->setMenu(0);

    QMenu::mouseReleaseEvent(event);
    act->setMenu(men);
  }else{
    QMenu::mouseReleaseEvent(event);
  }
}

Единственным недостатком является то, что такое меню будет реагировать на нажатие на все опции с подменю, а не только на нужные.Возможно, было бы неплохо проверить, связано ли что-нибудь с сигналами действия?

На моем Ubuntu это работает.Тем не менее, я думаю, что это не сработает на окнах, где система управляет исключительно меню (если qt не использует некоторые окна с внешним видом меню, а не с системными меню), но я слишком ленив, чтобы установить окна, просто чтобы проверить это;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...