Russian Qt Forum

Qt => Общие вопросы => Тема начата: Germiona от Май 30, 2008, 12:20



Название: сигналы QMenuBar
Отправлено: Germiona от Май 30, 2008, 12:20
Добрый день!

Подскажите, чем отличаются сигналы QMenuBar: activated() и highlighted() ?



Название: Re: сигналы QMenuBar
Отправлено: pastor от Май 30, 2008, 12:31
activated() - когда вы произвели клин по кнопке
highlighted() - когды вы навели указатель мыши на кнопку

Если выпишите на Qt 4 используйте triggered() и hovered() соответсвенно вместо указаных вами


Название: Re: сигналы QMenuBar
Отправлено: Germiona от Май 30, 2008, 12:55
Нет,я пишу Qt3

А как сделать,чтобы элемент меню активировался только при нажатии,а при наведении мыши ничего бы не происходило?

Элемент представляет собой QString

Код:
int id = menuBar->insertItem("EXIT");

При создании connect-а он активируется и при нажатии,и при наведении

Код:
menuBar->connectItem(id,this,SLOT(exit()));

Возможно ли это изменить?  ???


Название: Re: сигналы QMenuBar
Отправлено: pastor от Май 30, 2008, 13:13
cм. Example: progress/progress.cpp.


Название: Re: сигналы QMenuBar
Отправлено: Germiona от Май 30, 2008, 13:28
Цитировать
cм. Example: progress/progress.cpp.


Вы имеете ввиду:
Код:
connect(menuBar, SIGNAL(activated(int),this,SLOT(doMenuItem(int))))

и в слоте doMenuItem задать id,при котором бы он выполнялся?


Название: Re: сигналы QMenuBar
Отправлено: pastor от Май 30, 2008, 14:52
имхо да, вне зависимости он id. Вам ведь все кнопки нужно так обработать?


Название: Re: сигналы QMenuBar
Отправлено: Germiona от Июнь 02, 2008, 10:07
Нет,такой будет только одна кнопка "Выход", все остальные представляют собой выпадающее меню


Название: Re: сигналы QMenuBar
Отправлено: Germiona от Июнь 02, 2008, 11:39
Ерунда какая-то получается,если делать как в примере:

Код:
connect(menuBar, SIGNAL(highlighted(int),this,SLOT(doMenuItem(int))))


Сначала слот doMenuItem(int) отрабатывается,а потом тот,что при сигнале activated(int)


Pastor, ну вы же гений в фильтрах  :) Подскажите как с помощью их сделать


Название: Re: сигналы QMenuBar
Отправлено: pastor от Июнь 02, 2008, 11:48
Покажите код как вы создаете меню


Название: Re: сигналы QMenuBar
Отправлено: Germiona от Июнь 02, 2008, 12:12
Код:
void MainWindow::createMenus()
{
    serviceForPrint = new QPopupMenu(this);
    imageScreen = new QPopupMenu(this);
    consoleMnu = new QPopupMenu(this);
    helpMnu = new QPopupMenu(this);
   
       
    QMenuBar *menuBar = new QMenuBar(this);

   
    menuBar->insertItem(tr("&Сервис для печати"), serviceForPrint);
    menuBar->insertItem(tr("Образ &экрана"), imageScreen);   
    menuBar->insertItem(tr("&Консоль"), consoleMnu);       
    menuBar->insertItem(tr("&Помощь"), helpMnu);       
   
    int idExit = menuBar->insertItem("&Выход);       
   
       
    idExit = menuBar->connectItem(idExit, this, SLOT(exit()));
   
    connect(menuBar, SIGNAL(highlighted(int)), this, SLOT(noActivated(int)));
                                         
}


Название: Re: сигналы QMenuBar
Отправлено: Sergeich от Июнь 02, 2008, 14:40
activated() - когда вы произвели клин по кнопке
highlighted() - когды вы навели указатель мыши на кнопку
Сигнал activated() вызывается при нажатии на элемент меню, не имеющего дочернего меню.
Сигнал highlighted() вызывается при раскрытии элемента меню или при наведении мыши на элемент меню, не имеющего дочернего меню.
А как сделать,чтобы элемент меню активировался только при нажатии,а при наведении мыши ничего бы не происходило?

Элемент представляет собой QString

Код:
int id = menuBar->insertItem("EXIT");

При создании connect-а он активируется и при нажатии,и при наведении

Код:
menuBar->connectItem(id,this,SLOT(exit()));

Возможно ли это изменить?  ???
Как я понял, проблема в том, что при ракрытии какого-либо элемента меню и последущем наведении на Exit вызывается сигнал activated(), а нужно чтобы Exit срабатывал только при нажатии на него.
  Проблему можно решить установкой событийного фильтра на MenuBar: ловить нажатие и отпускание кнопки мыши. Как-то так:
Код:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
bool eventFilter( QObject* obj, QEvent* e );
public slots:
void onExit();
private:
bool mousePressed;
};

MainWindow::MainWindow() : QMainWindow()
{
mousePressed = false;

QPopupMenu* fileMenu = new QPopupMenu( this );
fileMenu->insertItem(tr("&Open"));
fileMenu->insertItem(tr("&Save"));
           menuBar()->insertItem(tr("&File"), fileMenu );       
           menuBar()->insertItem( tr("&Exit"), this, SLOT(onExit()) );     
menuBar()->installEventFilter( this );
}

bool MainWindow::eventFilter( QObject* obj, QEvent* e )
{
if ( obj == menuBar() ) {
if ( e->type() == QEvent::MouseButtonPress && ((QMouseEvent*)e)->button() == LeftButton )
mousePressed = true;
if ( e->type() == QEvent::MouseButtonRelease && ((QMouseEvent*)e)->button() == LeftButton )
mousePressed = false;
}
return false;
}

void MainWindow::onExit()
{
if (mousePressed)
qApp->quit(); 
}


Название: Re: сигналы QMenuBar
Отправлено: Germiona от Июнь 02, 2008, 15:41

Sergeich, огромнейшее вам спасибо  :-* :-* :-*,у меня все получилось  :D :D :D