Russian Qt Forum

Qt => Вопросы новичков => Тема начата: UVD от Июнь 01, 2016, 06:42



Название: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: 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...

в чем может быть дело?


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: PimenS от Июнь 01, 2016, 07:21
Цитировать
if(connect(m_RemarkAction, SIGNAL(triggered()), this, SLOT(setRemark())))

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


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: gil9red от Июнь 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, по коду вроде бы ошибок нет


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: PimenS от Июнь 01, 2016, 07:54
Не знал. Да видно еще и забыл.  :)


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: Bepec от Июнь 01, 2016, 08:54
Мб потому что есть сигнал
Код:
triggered (bool)
и нет сигнала
Код:
triggered ()
:)

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

PS и смотрите лог сборки - moc вас 100% наругал за несуществующий сигнал.


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: UVD от Июнь 01, 2016, 09:14
указывал и так и так в разных вариантах - тоже самое
Код:
connect(m_RemarkAction, SIGNAL(triggered(QAction *)), this, SLOT(setRemark(QAction *)))

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

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


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: gil9red от Июнь 01, 2016, 09:26
Попробуйте:
Код
C++ (Qt)
connect(m_RemarkAction, SIGNAL(triggered(bool)), this, SLOT(setRemark()))


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: UVD от Июнь 01, 2016, 09:40
пробовал и так тоже - нет коннекта даже


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: Bepec от Июнь 01, 2016, 09:48
1) Не страдайте эм... фигней, читайте вывод сборки. Там всё напишет - какие сигналы не соответствуют, какие слоты отсутствуют.
2) предоставьте ПОЛНЫЙ код, а не жалкие огрызки.


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: UVD от Июнь 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 (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*)));


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: Bepec от Июнь 01, 2016, 09:56
Ещё проблему нашли.
Связывать сигнал можно со слотами, имеющими меньшее количество параметров.
Но нельзя связывать сигнал со слотом, если у сигнала меньшее количество параметров.


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: GreatSnake от Июнь 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 ?


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: kai666_73 от Июнь 01, 2016, 11:21
Если connect не валиден, то увидеть это можно только в рантайм выхлопе: что-то вроде
No such SIGNAL|SLOT...


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: kambala от Июнь 01, 2016, 11:44
Мб потому что есть сигнал
Код:
triggered (bool)
и нет сигнала
Код:
triggered ()
:)

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


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: Bepec от Июнь 01, 2016, 11:48
Тут хз, в 4.7 дало бы отлуп. 4.8 не пробовал :)


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: kambala от Июнь 01, 2016, 11:52
работало и до 4.7. ты реально пробовал или тебе просто так кажется? :)


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: UVD от Июнь 01, 2016, 11:59
Показ меню в paintEvent() это просто жесть. Такого здесь ещё не видел.
GraphView::setRemark() описан как Q_SLOT ?

да это бог с ним, я накидываю как понимаю, c qt разбираюсь неделю всего, ковыряю чужую программу, а это сами знаете
а с с++ две недели

GraphView.h

Код:
public slots:
void setRemark(); //{ QMessageBox::information(this, "REMARK", "REMARK CONNECT!"); };


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: Bepec от Июнь 01, 2016, 12:00
4.7.2 пробовал. Он плевался в рантаймен отсутствием сигнала :)


Название: Re: Qt 4.8.6 - QMenu показывается, но не срабатывает (
Отправлено: UVD от Июнь 01, 2016, 12:45
весь код программы находится здесь: https://github.com/rcg17/uvdg-qt (https://github.com/rcg17/uvdg-qt)