Russian Qt Forum
Ноябрь 24, 2024, 21:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt 4.8.6 - QMenu показывается, но не срабатывает (  (Прочитано 7811 раз)
UVD
Гость
« : Июнь 01, 2016, 06:42 »

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


Код:
//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());}
...
}


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

соединение не устанавливаается почемуто... connect(m_RemarkAction, SIGNAL(trig...

в чем может быть дело?
« Последнее редактирование: Июнь 01, 2016, 07:33 от UVD » Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Июнь 01, 2016, 07:21 »

Цитировать
if(connect(m_RemarkAction, SIGNAL(triggered()), this, SLOT(setRemark())))

Разве connect что-то возвращает?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Июнь 01, 2016, 07:30 »

Цитировать
if(connect(m_RemarkAction, SIGNAL(triggered()), this, SLOT(setRemark())))

Разве connect что-то возвращает?

Цитировать
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) [static]

Создает соединение заданного типа type между сигналом signal объекта-отправителя sender и методом method в объекте-приёмнике receiver. Возвращает true, если соединение удалось; в противном случае возвращает false.

PimenS, по коду вроде бы ошибок нет
« Последнее редактирование: Июнь 01, 2016, 07:32 от gil9red » Записан

PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #3 : Июнь 01, 2016, 07:54 »

Не знал. Да видно еще и забыл.  Улыбающийся
Записан
Bepec
Гость
« Ответ #4 : Июнь 01, 2016, 08:54 »

Мб потому что есть сигнал
Код:
triggered (bool)
и нет сигнала
Код:
triggered ()
Улыбающийся

В коннекте должны быть указаны все параметры сигнала и слота.

PS и смотрите лог сборки - moc вас 100% наругал за несуществующий сигнал.
« Последнее редактирование: Июнь 01, 2016, 08:56 от Bepec » Записан
UVD
Гость
« Ответ #5 : Июнь 01, 2016, 09:14 »

указывал и так и так в разных вариантах - тоже самое
Код:
connect(m_RemarkAction, SIGNAL(triggered(QAction *)), this, SLOT(setRemark(QAction *)))

гдетто видел что это is the same

никто меня не ругал все ок
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #6 : Июнь 01, 2016, 09:26 »

Попробуйте:
Код
C++ (Qt)
connect(m_RemarkAction, SIGNAL(triggered(bool)), this, SLOT(setRemark()))
Записан

UVD
Гость
« Ответ #7 : Июнь 01, 2016, 09:40 »

пробовал и так тоже - нет коннекта даже
Записан
Bepec
Гость
« Ответ #8 : Июнь 01, 2016, 09:48 »

1) Не страдайте эм... фигней, читайте вывод сборки. Там всё напишет - какие сигналы не соответствуют, какие слоты отсутствуют.
2) предоставьте ПОЛНЫЙ код, а не жалкие огрызки.
Записан
UVD
Гость
« Ответ #9 : Июнь 01, 2016, 09:54 »

1>------ Rebuild All started: Project: project, Configuration: Release Win32 ------
1>  GraphView.cpp
1>  main.cpp
1>  MainWindow.cpp
1>MainWindow.cpp(158): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\stdio.h(311) : see declaration of 'sscanf'
1>  moc_GraphView.cpp
1>  moc_MainWindow.cpp
1>  Mutex.cpp
1>  Generating code
1>  Finished generating code
1>  proj.vcxproj -> D:\Release\proj.exe
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

http://doc.qt.io/qt-4.8/signalsandslots.html

All of these would work:
Код:
connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(Qbject*)));
connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed()));
connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed()));

But this one won't work:

Код:
connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed(QObject*)));
Записан
Bepec
Гость
« Ответ #10 : Июнь 01, 2016, 09:56 »

Ещё проблему нашли.
Связывать сигнал можно со слотами, имеющими меньшее количество параметров.
Но нельзя связывать сигнал со слотом, если у сигнала меньшее количество параметров.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Июнь 01, 2016, 11:07 »

Код:
//Показ меню в
//GraphView.cpp
void GraphView::paintEvent(QPaintEvent *event)
{
if (QApplication::mouseButtons()==Qt::RightButton) {tailContextMenu.exec(QCursor::pos());}
...
}
Показ меню в paintEvent() это просто жесть. Такого здесь ещё не видел.
GraphView::setRemark() описан как Q_SLOT ?
Записан

Qt 5.11/4.8.7 (X11/Win)
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #12 : Июнь 01, 2016, 11:21 »

Если connect не валиден, то увидеть это можно только в рантайм выхлопе: что-то вроде
No such SIGNAL|SLOT...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Июнь 01, 2016, 11:44 »

Мб потому что есть сигнал
Код:
triggered (bool)
и нет сигнала
Код:
triggered ()
Улыбающийся

В коннекте должны быть указаны все параметры сигнала и слота.
параметры, имеющие значения по умолчанию, можно игнорировать
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #14 : Июнь 01, 2016, 11:48 »

Тут хз, в 4.7 дало бы отлуп. 4.8 не пробовал Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.164 секунд. Запросов: 23.