Qt: галочка рядом с пунктом меню

В моем приложении пользователь может выбрать comport из списка всех доступных comports. Это должно быть сделано в меню, заполненном виджетами QAction. Однако текущий код не показывает, какой порт был выбран, и для того, чтобы сделать приложение более интуитивно понятным, я хотел бы указать, какой порт был выбран, тем самым показывая пользователю, в каком состоянии находится программа. значка (например, галочки) в меню рядом с выбранным портом было бы очевидно, какой порт был выбран. Каков правильный способ сделать это?

Мой код:

# Populate the serial port menu with all the available ports.
for port in comports(): 
    _port = QtWidgets.QAction(port[0], mainWindow)
    _port.setCheckable(True)   # WRONG!
    self.menuChoose_port.addAction(_port)
    _port.triggered.connect(self.comportSelect)

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

Требуются галочки, а не флажки


person ADB    schedule 12.05.2014    source источник
comment
Может быть, вы можете использовать QActionGroup, чтобы сделать активным только одно из действий за раз?   -  person vahancho    schedule 12.05.2014
comment
Спасибо, попробую. Я также нашел эту ссылку, которая также может помочь.   -  person ADB    schedule 13.05.2014
comment
Если вам удалось это исправить, вы должны опубликовать ответ здесь   -  person Tobias Kienzler    schedule 07.03.2016


Ответы (1)


С опозданием на несколько лет и на С++, но на случай, если кто-то сюда доберется, вот что я сделал (отказ от ответственности: это что-то вроде взлома):

  1. Сохранить ссылку на действие, выбранное в данный момент
  2. Когда выбрано, установите флаги checked и checkable в значение true для выбранного элемента.
  3. После изменения выбора снимите флажок с выбранного действия и обновите ссылку

Кажется, это позволяет проверять элементы, но только один элемент за раз. Это решение на самом деле работает только для сохранения одного выбора.

// in the header:
QAction *selectedAction = nullptr;

// in the cpp file
QAction *act = new QAction("exampleItem");

connect(act, &QAction::triggered, [this, act] {
  if (selectedAction != nullptr) {
    selectedAction->setChecked(false);
    selectedAction->setCheckable(false);
  }
  act->setCheckable(true);
  act->setChecked(true);
  selectedAction = newAction;
})

menu->addAction(act);
person Hikash    schedule 04.06.2020