C++, Qt, Портфолио

Эмулятор работы инспектора машинного зрения (формирование выходных файлов)

При написании одного проекта мне необходимо обрабатывать файлы, формируемые на основании полученных данных от инспектора машинного зрения. Содержимое файла — список штрих-кодов определенного количества, наименование файла — <год месяц день>_<штрих-код короба>. Эти файлы сохраняются в определенном каталоге,  а формируются с периодичность N миллисекунд. Для тестирования приложения мне необходимо написать эмулятор такого «инспектора». Приложение будет формировать файлы со списком штрих-кодов и сохранять в заданный каталог.

главное окно эмулятора

Основной класс, отвечающий за работу эмулятора выглядит таким образом: Продолжить чтение «Эмулятор работы инспектора машинного зрения (формирование выходных файлов)»

Qt

QTableWidget: добавить список QComboBox  в ячейку

Допустим, в объекте values типа QMap<QString, QString> хранятся некоторые пары значений, которыми необходимо заполнить выпадающие списки QComboBox в таблице типа QTableWidget. Таким образом, для каждой строки будет существовать поле, допустимые значения для которого будут браться из заранее определенного и сформированного списка. Самый простой способ установки некоторого объекта в качестве ячейки таблицы — воспользоваться функцией setCellWidget.

[pastacode lang=»cpp» manual=»ui-%3EtableWidget-%3EsetRowCount(ui-%3EtableWidget-%3ErowCount()%2B1)%3B%0AQComboBox%20*box%20%3D%20new%20QComboBox%3B%0A%2F%2F%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D0%BC%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%B9%20%D0%BA%D0%B0%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%2C%0A%2F%2F%D0%B0%20%D1%81%D0%B0%D0%BC%D0%B8%20%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%20-%20%D0%BA%D0%B0%D0%BA%20userData%0Aforeach(QString%20index%2C%20values.keys())%0A%09box-%3EaddItem(values.value(index)%2C%20index)%3B%0A%2F%2F%D0%BF%D0%BE%20%D0%B3%D0%BE%D1%80%D0%B8%D0%B7%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D0%B8%20%D1%80%D0%B0%D1%81%D1%82%D1%8F%D0%BD%D0%B5%D0%BC%2C%20%D0%BF%D0%BE%20%D0%B2%D0%B5%D1%80%D1%82%D0%B8%D0%BA%D0%B0%D0%BB%D0%B8%20-%20%D0%BA%D0%B0%D0%BA%20%D1%80%D0%B5%D1%88%D0%B8%D1%82%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%20%3A)%0Abox-%3EsetSizePolicy(QSizePolicy%3A%3AExpanding%2C%20QSizePolicy%3A%3APreferred)%3B%0A%2F%2F%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC%20%D0%B2%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20QTableWidget%20%D0%B2%20%D0%BA%D0%BE%D0%BB%D0%BE%D0%BD%D0%BA%D1%83%20%E2%84%965%0Aui-%3EtableWidget-%3EsetCellWidget(ui-%3EtableWidget-%3ErowCount()%20-%201%2C%205%2C%20box)%3B» message=»» highlight=»» provider=»manual»/]

Теперь выведем все ключи и их значения списков таблицы в дебаг: Продолжить чтение «QTableWidget: добавить список QComboBox  в ячейку»

C++, Qt, Портфолио

DBRecordWidget — Библиотека-виджет для работы с данными (Qt)

Сегодня вашему вниманию предстанет моя библиотека DBRecordWidget, которую я написала на Qt для удобства разработки пользовательского интерфейса приложения, требующего работу с моделями данных. Это могут быть и SQL модели, и другие. Библиотека не зависит от разновидности.

Открыта для общего доступа на BitBucket:

https://secretsilent@bitbucket.org/slalimited/dbrecordwidget.git

Поподробнее о DBRecordWidget…

Библиотека представляет собой виджет, где можно добавить кнопки Добавить, Изменить, Удалить, Экспорт, Импорт и пр. — в перечислении:

[pastacode lang=»cpp» manual=»namespace%20operationButtons%20%7B%0AQ_NAMESPACE%0Aenum%20buttons%20%7Binsert%3D0%2C%20update%2C%20remove%2C%20import_%2C%20export_%2C%20report%2C%20refresh%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20save%2C%20print%7D%3B%0AQ_ENUM_NS(buttons)%0A%7D» message=»» highlight=»» provider=»manual»/]

Продолжить чтение «DBRecordWidget — Библиотека-виджет для работы с данными (Qt)»

C++, Qt, Базы данных

Отображение данных выборки в виджете QTableView

Предположим, что на форме расположен объект класса QStackedWidget, на страницах которого расположены объекты QTableView, отображающие различные данные. В один момент времени данные будут отображаться только в одном из виджетов QTableView (по одному на страницу stacked widget). Объявим модель для данных типа QSqlQueryModel: Продолжить чтение «Отображение данных выборки в виджете QTableView»

Qt

Добавление данных в таблицу QTableWidget. Очистка таблицы

Необходимо организовать добавление данных в таблицу QTableWidget. Для начала расположим на форме виджет класса QTableWidget с именем tableWidget. Создадим в таблице пару колонок, назвав их, скажем, «Колонка 1» и «Колонка 2».

Предположим, что в объекте map типа QMap<QString, QString> у нас хранятся некие данные, которые в определенный момент мы хотим разместить в табличке.

Прежде, чем организовать добавление данных в ячейки виджета, нужно их создать. Тогда, процесс заполнения таблицы будет выглядеть следующим образом: Продолжить чтение «Добавление данных в таблицу QTableWidget. Очистка таблицы»

Qt, Базы данных

Qt. Динамическое создание виджетов на форме

Динамическое создание виджетов на форме может помочь, когда расположение и/или видимость виджетов подпадает под какие-то условия. Приведу пример. Допустим, в базе данных есть некая таблица, в которой хранятся настройки видимости, подписи, id наименований колонок основных таблиц базы, где хранятся важные данные:

[pastacode lang=»sql» manual=»CREATE%20TABLE%20table_settings%0A(%0Aid%20serial%20NOT%20NULL%2C%0Atable_id%20integer%20NOT%20NULL%2C%0Acolumn_id%20integer%2C%0Avisible%20boolean%20NOT%20NULL%20DEFAULT%20true%2C%0Acaption%20character%20varying(50)%2C%0Aname_%20character%20varying(50)%2C%0ACONSTRAINT%20table_settings_pkey%20PRIMARY%20KEY%20(id)%2C%0ACONSTRAINT%20table_settings_table_id_fkey%20FOREIGN%20KEY%20(table_id)%0AREFERENCES%20table_names%20(id)%20MATCH%20SIMPLE%0AON%20UPDATE%20CASCADE%20ON%20DELETE%20CASCADE%0A)» message=»» highlight=»» provider=»manual»/]

где

  • id — ID записи п/п
  • table_id — id таблицы, о колонках которой хранится информация
  • visible — должна ли быть данная колонка видна
  • caption — название колонки, которое задается пользователем
  • name_ — наименование колонки, которое задается при создании таблицы

[pastacode lang=»sql» manual=»CREATE%20TABLE%20table_names%0A(%0Aid%20serial%20NOT%20NULL%2C%0Aname_%20character%20varying%20NOT%20NULL%2C%0ACONSTRAINT%20table_names_pkey%20PRIMARY%20KEY%20(id)%2C%0ACONSTRAINT%20table_names_name__key%20UNIQUE%20(name_)%0A)» message=»» highlight=»» provider=»manual»/]

А это, собственно, та таблица, где хранятся наименования таблиц, для которых нам надо выставить некие настройки.

Для динамического создания виджетов (пусть в нашем примере это будут виджеты классов QLabel и QLineEdit — подпись и поле ввода) на форме разместим объект QGridLayout, куда мы будем «пихать» виджеты. Я еще делаю такой трюк: помещаю в layout объекты в ряд в таком количестве, как хочу видеть результат:

Динамическое создание виджетов на форме в Qt

Далее эти два виджета делаю невидимыми:

[pastacode lang=»cpp» manual=»ui-%3Elabel-%3EsetVisible(false)%3B%0Aui-%3ElineEdit-%3EsetVisible(false)%3B» message=»» highlight=»» provider=»manual»/]

Для того, чтобы не просто разместить виджеты на форме, но и потом брать из них информацию для наших нужд, объявим в отделе private класса формы объект класса QVector<QLineEdit*> lineEdits.

Теперь приступим непосредственно к динамическому созданию виджетов.

[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0A%2F%2F%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BC%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D1%83%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D1%8B%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B8%D0%B7%20%D0%B1%D0%B0%D0%B7%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%0Aif%20(!query.exec(QString(%22select%20column_id%2C%20caption%2C%20name_%2C%20visible%20from%20table_settings%20%22%0A%22where%20%22%0A%22table_id%20%3D%20(select%20id%20from%20table_names%20where%20%22%0A%22name_%20%3D%20’products’)%20%22%0A%22order%20by%20column_id%22)))%0AqDebug()%20%3C%3C%20query.lastError().text()%3B%20%0Awhile%20(query.next())%20%7B%20%0A%09QLabel%20*newLabel%20%3D%20new%20QLabel(this)%3B%20%2F%2F%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BA%D0%BE%D0%BB%D0%BE%D0%BD%D0%BA%D0%B8%20newLabel-%3EsetText(query.value(1).toString()%2B%22%3A%22)%3B%0A%09newLabel-%3EsetObjectName(%22label%22%2Bquery.value(2).toString())%3B%0A%09%2F%2F%D0%B2%D0%B8%D0%B4%D0%B8%D0%BC%D1%8B%D0%B9%20%D0%B2%20%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D0%BE%D1%82%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20visible%20%D0%B2%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0%D1%85%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%0A%09newLabel-%3EsetVisible(query.value(3).toBool())%3B%0A%09%2F%2F%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%20%D0%B2%20layout%0A%09ui-%3EwidgetsLayout-%3EaddWidget(newLabel)%3B%20%2F%2FQGridLayout%0A%09QLineEdit%20*newEdit%20%3D%20new%20QLineEdit(this)%3B%0A%09newEdit-%3EsetObjectName(query.value(2).toString())%3B%0A%09newEdit-%3EsetVisible(query.value(3).toBool())%3B%0A%09ui-%3EwidgetsLayout-%3EaddWidget(newEdit)%3B%0A%09%2F%2F%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC%20%D0%B2%20%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%0A%09lineEdits.push_back(newEdit)%3B%0A%7D%0A%2F%2F%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0%20%D1%84%D0%BE%D1%80%D0%BC%D1%8B%20%D0%B2%20%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D0%BE%D1%82%20%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BD%D0%B0%20%D0%BD%D0%B5%D0%B9%20%D0%B2%D0%B8%D0%B4%D0%B6%D0%B5%D1%82%D0%BE%D0%B2%0Athis-%3Eresize(this-%3EsizeHint())%3B» message=»» highlight=»» provider=»manual»/]

Динамическое создание виджетов на форме в Qt

Чтобы обратится к отдельному объекту в векторе, достаточно указать его индекс:

[pastacode lang=»cpp» manual=»for%20(int%20i%20%3D%200%3B%20i%20%3C%20lineEdits.size()%3B%20%2B%2Bi)%0A%09qDebug()%20%3C%3C%20lineEdits%5Bi%5D-%3EobjectName()%20%3C%3C%20%22%20-%20%22%20%3C%3C%20lineEdits%5Bi%5D-%3Etext()%3B» message=»» highlight=»» provider=»manual»/]

Более элегантная и универсальная версия этого метода представлена здесь: Динамическое создание виджетов Qt. QGridLayout

Qt, Базы данных

Подключение к базе данных в Qt

Для подключения к базе данных нам необходимо включить в проект следующие классы:

[pastacode lang=»cpp» manual=»%23include%20%3CQMessageBox%3E%20%2F%2F%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8E%0A%23include%20%3CQSqlDatabase%3E%0A%23include%20%3CQSqlError%3E» message=»» highlight=»» provider=»manual»/]

QMessageBox позволит вывести информацию о статусе подключения к базе данных, QSqlDatabase позволит совершить это подключение, а без QSqlError мы не сможем узнать, какая ошибка возникла при неудачном подключении к базе.
Необходимо также в тексте файла проекта (*.pro) указать следующее:

QT += sql

[pastacode lang=»cpp» manual=»%2F*QPSQL%20-%20%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%20%D1%82%D0%BE%D0%B9%20%D0%B8%D0%BB%D0%B8%20%D0%B8%D0%BD%D0%BE%D0%B9%20%D0%A1%D0%A3%D0%91%D0%94%2C%20%D0%B2%20%D0%B4%D0%B0%D0%BD%D0%BD%D0%BE%D0%BC%20%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B5%20-%20%D0%BA%20PostgreSQL%3B%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%20%D0%B1%D0%B0%D0%B7%D0%B5%20MS%20SQL%20Server%20%D0%B2%D0%B0%D0%BC%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%20%D1%81%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20ODBC*%2F%0A%0AQSqlDatabase%20db%20%3D%20QSqlDatabase%3A%3AaddDatabase(%22QPSQL%22)%3B%20%20%2F*%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80%D0%B0%20%D0%91%D0%94%20%D1%82%D0%B0%D0%BA%D0%B6%D0%B5%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D1%8C%20%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D1%83%20%D0%91%D0%94%3A%20addDatabase(%22QPSQL%22%2C%20%22myConnection1%22)%0A%D0%B8%D0%BC%D1%8F%20%D0%B8%D0%BB%D0%B8%20%D0%B0%D0%B4%D1%80%D0%B5%D1%81%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0%2C%20%D0%B3%D0%B4%D0%B5%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%A1%D0%A3%D0%91%D0%94*%2F%0Adb.setHostName(%22localhost%22)%3B%0A%2F%2F%D0%B8%D0%BC%D1%8F%20%D0%B1%D0%B0%D0%B7%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%0Adb.setDatabaseName(%22myDB%22)%3B%0A%2F%2F%D0%B8%D0%BC%D1%8F%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%0Adb.setUserName(%22user1%22)%3B%0A%2F%2F%D0%B5%D0%B3%D0%BE%20%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%0Adb.setPassword(%22123321%22)%3B%0A%2F*%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%3B%20%D0%B5%D1%81%D0%BB%D0%B8%20%D0%BD%D0%B5%D1%83%D0%B4%D0%B0%D1%87%D0%BD%D0%BE%20-%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B8%D0%BC%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BE%D0%B1%20%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B5*%2F%0Aif%20(!db.open())%0AQMessageBox%3A%3Acritical(NULL%2CQObject%3A%3Atr(%22%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0%22)%2Cdb.lastError().text())%3B» message=»» highlight=»» provider=»manual»/]

При попытке подключения к базе данных PostgreSQL можно получить сообщение об ошибке «Driver not loaded». Это значит, что ваша система не может найти драйвер PostgreSQL. Необходимо в системный путь (PATH) вписать пути к папкам lib и bin вашей версии СУБД.

При удачном подключении к базе данных все обращения к базе в вашем проекте будут автоматически распознавать это подключение. Если подключение было задано без наименования подключения, то оно будет расцениваться как подключение по умолчанию. В проекте обязательно должно быть такое подключение, иначе получим ошибку. Работая с потоками в проекте для каждого потока должно быть свое подключение под своим именем.

Подключение к базе данных Microsoft SQL Server в Qt.

Инфо обо мне: https://secretsilent.ru/info/

Qt

Контекстное меню в Qt. Popup Menu

Представим, что на форме нужен некий объект, при нажатии правой кнопкой мыши на который вызовется его контекстное меню. Чтобы организовать работу контекстного меню в конструкторе формы напишем

[pastacode lang=»cpp» manual=»ui-%3EpushButton-%3EsetContextMenuPolicy(Qt%3A%3ACustomContextMenu)%3B%0Aconnect(ui-%3EpushButton%2C%20SIGNAL(customContextMenuRequested(const%20QPoint%26))%2C%20%0A%09%09this%2C%20SLOT(ShowContextMenu(const%20QPoint%26)))%3B» message=»» highlight=»» provider=»manual»/]

Если мы привязываем объект pushButton. Здесь можно указать интересующий лично вас объект.

Дальше создаем функцию-слот ShowContextMenu(const QPoint&):

[pastacode lang=»cpp» manual=»void%20MyClass%3A%3AShowContextMenu(const%20QPoint%26%20pos)%0A%7B%0A%2F%2F%20for%20most%20widgets%0AQPoint%20globalPos%20%3D%20ui-%3EpushButton-%3EmapToGlobal(pos)%3B%0A%2F%2F%20for%20QAbstractScrollArea%20and%20derived%20classes%20you%20would%20use%3A%0A%2F%2F%20QPoint%20globalPos%20%3D%20myWidget-%3Eviewport()-%3EmapToGlobal(pos)%3B%0AQMenu%20myMenu%3B%0AmyMenu.addAction(%22%D0%9F%D1%83%D0%BD%D0%BA%D1%82%201%22%2C%20this%2C%20SLOT(on_action_1()))%3B%0AmyMenu.addAction(%22%D0%9F%D1%83%D0%BD%D0%BA%D1%82%202%22%2C%20this%2C%20SLOT(on_action_2()))%3B%0AmyMenu.exec(globalPos)%3B%0A%7D%0Avoid%20MyClass%3A%3Aon_action_1()%0A%7B%0A%2F%2F%D1%82%D0%B5%D0%BB%D0%BE%20%D1%81%D0%BB%D0%BE%D1%82%D0%B0%20on_action_1%0A%7D%0Avoid%20MyClass%3A%3Aon_action_2()%0A%7B%0A%2F%2F%D1%82%D0%B5%D0%BB%D0%BE%20%D1%81%D0%BB%D0%BE%D1%82%D0%B0%20on_action_2%0A%7D» message=»» highlight=»» provider=»manual»/]

Функцию ShowContextMenu(const QPoint&) не забываем вставить в список слотов в h-файле. Так же, как и слоты on_action_1() и on_action_2().

Слоты on_action_1() и on_action_2() отвечают за те действия, что произойдут после выбора соответствующих пунктов контекстного меню.

У метода addAction() есть несколько возможных параметров, можно указать иконку, сочетание клавиш как shortcut и пр. Описание можно найти в документации.