Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Autochapa
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 32
#1

Qt 4.8.6 - QMenu показывается, но не срабатывает - C++ Qt

01.06.2016, 04:37. Просмотров 369. Ответов 16
Метки qt (Все метки)

вот как реализован код:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//GraphView.h
//Объявление переменных
class GraphView : public QWidget
{
    Q_OBJECT
 
    QAction* m_RemarkAction;
    QMenu tailContextMenu;          
...
}
 
//GraphView.cpp
//Обработчик щелчка по пункту меню
void GraphView::setRemark()
{
    m_beep->play();
    QMessageBox::information(this, "REMARK", "REMARK CONNECT!");
}
 
//GraphView.cpp
GraphView::GraphView()
{
    m_RemarkAction = tailContextMenu.addAction("Add/Edit Remark");
    if(connect(m_RemarkAction, SIGNAL(triggered()), this, SLOT(setRemark()))) {QMessageBox::information(this, "REMARK", "CONN OK!");} else {QMessageBox::information(this, "REMARK", "CONN BAD!");};
 
...
}
 
//Показ меню в
//GraphView.cpp
void GraphView::paintEvent(QPaintEvent *event)
{
if (QApplication::mouseButtons()==Qt::RightButton) {tailContextMenu.exec(QCursor::pos());} 
...
}

меню появляется, но при выборе пункта меню ничего не происходит

в чем может быть дело?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2016, 04:37
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Qt 4.8.6 - QMenu показывается, но не срабатывает (C++ Qt):

Меню QMenu
Здравствуйте. Создаю меню в дизайнере. Но в некоторых из пунктов меню отсутствует выпадающее меню. Я хочу, чтобы на эти пункты можно было...

QPushButton+QMenu
Помогите пожалуйста. Сделал я кнопку прикрепив к ней меню menuButton = new QPushButton(this); menuButton ->...

QMenu, QAction
Добрый день товарищи. Вопрос: можно ли как-то узнать индекс QAction'a нажатого в QMenu.

Не показывает QMenu
Пытался сделать меню в приложении. void Widget::set_menu() { qDebug()<<"set menu"<<endl; QMenuBar mnuBar; QMenu* ...

QMenu и QGroupBox
Собственно, как обернуть QMenu в QGroupBox?

Фокус в QMenu
Как установить фокус на определённый action в QMenu...или что нужно переопределить для этого? Жаль, что setActiveAction не устанавливает...

16
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
01.06.2016, 09:09 #2
graphview.h:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef GRAPHVIEW_H
#define GRAPHVIEW_H
 
#include "ui_graphview.h"
 
#include <QAction>
#include <QMenu>
#include <QMessageBox>
 
class GraphView : public QWidget, private Ui::GraphView
{
    Q_OBJECT
 
    QAction* m_RemarkAction;
    QMenu *tailContextMenu;
 
private slots:
    void setRemark();
    void showContextMenu(QPoint pos);
 
public:
    explicit GraphView(QWidget *parent = 0);
};
 
#endif // GRAPHVIEW_H
graphview.cpp:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "graphview.h"
 
GraphView::GraphView(QWidget *parent) :
    QWidget(parent)
{
    setupUi(this);
 
    tailContextMenu = new QMenu(this);
    tailContextMenu->addAction("Add/Edit Remark", this, SLOT(setRemark()));
 
    setContextMenuPolicy(Qt::CustomContextMenu);
    // при вызове контекстного меню будет эмитироваться сигнал
    // customContextMenuRequested(QPoint)
 
    // соединим этот сигнал и слот showContextMenu(QPoint pos)
    connect(this, SIGNAL(customContextMenuRequested(QPoint)),
            SLOT(showContextMenu(QPoint)));
}
 
void GraphView::setRemark()
{
    //m_beep->play();
    QMessageBox::information(this, "REMARK", "REMARK CONNECT!");
}
 
// слот, который будет отображать контекстное меню
void GraphView::showContextMenu(QPoint pos)
{
    tailContextMenu->exec(mapToGlobal(pos));
}
А отображать контекстное меню с помощью paintEvent - вообще не здравая идея.
1
Autochapa
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 32
01.06.2016, 09:24  [ТС] #3
fatal error C1083: Cannot open include file: 'ui_graphview.h': No such file or directory
0
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
01.06.2016, 12:14 #4
Вам нужно было скопировать только тот код, который относится к меню, в вашем случае не используются формы дизайнера в проекте, отсюда и ошибка об отсутствии заголовочного файла ui_graphview.h
0
Autochapa
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 32
01.06.2016, 12:18  [ТС] #5
пробовал, не работает
0
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
01.06.2016, 12:35 #6
выложите ваш проект одним файлом, в виде архива
0
Autochapa
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 32
01.06.2016, 12:43  [ТС] #7
весь код программы находится https://github.com/rcg17/uvdg-qt

буду очень благодарен за помощь
0
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
01.06.2016, 13:47 #8
Добавил в private-секцию класса GraphView:

C++ (Qt)
1
2
    QAction* m_RemarkAction;
    QMenu *tailContextMenu;
добавил в класс GraphView секцию слотов:

C++ (Qt)
1
2
3
private slots:
    void setRemark();
    void showContextMenu(QPoint pos);
в конструкторе класса, после setMouseTracking пишем:

C++ (Qt)
1
2
3
4
5
    tailContextMenu = new QMenu(this);
    tailContextMenu->addAction("Add/Edit Remark", this, SLOT(setRemark()));
    setContextMenuPolicy(Qt::CustomContextMenu);
    connect(this, SIGNAL(customContextMenuRequested(QPoint)),
            SLOT(showContextMenu(QPoint)));
и реализацию для слотов:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
void GraphView::setRemark()
{
    //m_beep->play();
    QMessageBox::information(this, "REMARK", "REMARK CONNECT!");
}
 
void GraphView::showContextMenu(QPoint pos)
{
    tailContextMenu->exec(mapToGlobal(pos));
}
Результат:

Qt 4.8.6 - QMenu показывается, но не срабатывает
Qt 4.8.6 - QMenu показывается, но не срабатывает
1
Autochapa
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 32
01.06.2016, 14:38  [ТС] #9
тоже самое сделал - не работает (

Добавлено через 2 минуты
//GraphView.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
...
private:
    QAction* m_RemarkAction;
    QMenu *tailContextMenu;
 
private slots:
    void setRemark();
    void showContextMenu(QPoint pos);
...

//GraphView.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void GraphView::setRemark()
{
    //m_beep->play();
    QMessageBox::information(this, "REMARK", "REMARK CONNECT!");
}
 
void GraphView::showContextMenu(QPoint pos)
{
    tailContextMenu->exec(mapToGlobal(pos));
}
 
GraphView::GraphView(UvdState *state)
{
...
    setMouseTracking(true);
 
    tailContextMenu = new QMenu(this);
    tailContextMenu->addAction("Add/Edit Remark", this, SLOT(setRemark()));
    setContextMenuPolicy(Qt::CustomContextMenu);
    connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showContextMenu(QPoint)));
 
}
Добавлено через 4 минуты
нет connect и нет вообще контекстного меню
0
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
01.06.2016, 15:03 #10
а просто через обработчик QContextMenuEvent пробовали?
0
Autochapa
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 32
01.06.2016, 15:44  [ТС] #11
не представляю даже как можно сделать меню через него...

да и самое главное - у меня почему не работает? а у вас работает!

нет коннекта с слоту вообще

Добавлено через 35 минут
есть еще файл moc_GraphView.cpp - может там надо чтото добавить?
0
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
01.06.2016, 15:57 #12
moc-файлы генерируются без участия пользователя, нет смысла туда "лезть"

Если нет соединения со слотом, то ради эксперимента создайте какую-нибудь кнопку и попробуйте связать со слотом, выполняющим хорошо видимые действия, чтобы проверить, будет ли установлено соединение в этом случае
0
Autochapa
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 32
01.06.2016, 16:30  [ТС] #13
ладно, бросаю я это дело
чтото тут не чисто, все делаю по примерам которые в инете, и ничего не работает

все остальные эксперимены сожрут мое время впустую

если можете - бросьте код, который работает - я у себя проверю напоследок...
0
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
01.06.2016, 16:42 #14
в graphview.h:

C++ (Qt)
1
2
3
4
5
6
protected:
    void contextMenuEvent(QContextMenuEvent *e);
 
   private slots:
    void setRemark();
//    void showContextMenu(QPoint pos);
в graphview.cpp, в конструкторе:

C++ (Qt)
1
2
3
4
5
6
7
8
    tailContextMenu = new QMenu(this);
    m_RemarkAction = tailContextMenu->addAction("Add/Edit Remark");
    connect(m_RemarkAction, SIGNAL(triggered(bool)), SLOT(setRemark()));
 
//    tailContextMenu->addAction("Add/Edit Remark", this, SLOT(setRemark()));
//    setContextMenuPolicy(Qt::CustomContextMenu);
//    connect(this, SIGNAL(customContextMenuRequested(QPoint)),
//            SLOT(showContextMenu(QPoint)));
и реализация обработчика:

C++ (Qt)
1
2
3
4
void GraphView::contextMenuEvent(QContextMenuEvent *e)
{
    tailContextMenu->exec(e->globalPos());
}
Реализацию showContextMenu(QPoint pos) тоже закомментируйте
0
Autochapa
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 32
01.06.2016, 17:22  [ТС] #15
меню теперь появляется где кликну, все ок
но собственно оно у меня и так появлялось где надо

но слот так и не коннектится, и ничего не срабатывает (
0
0x90h
321 / 287 / 108
Регистрация: 01.10.2015
Сообщений: 863
01.06.2016, 17:29 #16
Цитата Сообщение от Autochapa Посмотреть сообщение
но слот так и не коннектится
а другие сигнально/слотовые соединения в проекте есть? если есть, то "рабочие" ли они?
0
Autochapa
0 / 0 / 0
Регистрация: 28.11.2015
Сообщений: 32
02.06.2016, 01:56  [ТС] #17
да естть
вот наапример, но для другой формы, первоначальной, с которой открываается другое окно рабочее
MainWindow.cpp
C++ (Qt)
1
2
3
    m_chooseLogFileButton = new QPushButton("Choose", this);
    connect(m_chooseLogFileButton, SIGNAL(clicked()), this, SLOT(chooseLogFileAction()));
    layout->addWidget(m_chooseLogFileButton);
а вот соединениия уже работающие TCP и в том окне
MainWindow.cpp
C++ (Qt)
1
2
3
4
5
    m_graphView = new GraphView(m_state);
    m_graphView->show();
.....
        connect(m_graphView, SIGNAL(reconnectRequested()), this, SLOT(requestReconnect()));
        connect(m_graphView, SIGNAL(disconnectRequested()), this, SLOT(requestDisconnect()));
я пробовал сюда добавлять, казалось бы вот оно, но ничего не происходит опять же, либо не так добаавил

для которых есть в
GraphView.h
C++ (Qt)
1
2
3
signals:
    void reconnectRequested();
    void disconnectRequested();
также в GraphView.cpp
C++ (Qt)
1
2
3
    m_timer = new QTimer(this);
    connect(m_timer, SIGNAL(timeout()), this, SLOT(timerFired()));
    m_timer->start(100);
GraphView.h
C++ (Qt)
1
2
protected slots:
    void timerFired();
они все работают (
ведь видно же, делаем все так же, и че ей надо?..
0
02.06.2016, 01:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2016, 01:56
Привет! Вот еще темы с решениями:

Qmenu контекстное меню
Как сделать контекстное меню для treewidget при нажатии правой кнопки мыши появлялось контекстное меню в нём есть Добавить Изменить ...

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

Checkable Action в Qmenu
Как сделать позицию в Qmenu так чтобы напротив неё был заначек выбрано/не выбрано как в прикрепленном изображении.

QMenu и внешние библиотеки
Доброго времени суток всем товарищи. Встала такая задача: добавить в программу поддержку добавления составных частей. На вход программе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru