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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: сигналы QMenuBar  (Прочитано 8775 раз)
Germiona
Гость
« : Май 30, 2008, 12:20 »

Добрый день!

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

Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Май 30, 2008, 12:31 »

activated() - когда вы произвели клин по кнопке
highlighted() - когды вы навели указатель мыши на кнопку

Если выпишите на Qt 4 используйте triggered() и hovered() соответсвенно вместо указаных вами
« Последнее редактирование: Май 30, 2008, 13:10 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Germiona
Гость
« Ответ #2 : Май 30, 2008, 12:55 »

Нет,я пишу Qt3

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

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

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

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

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

Возможно ли это изменить?  Непонимающий
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Май 30, 2008, 13:13 »

cм. Example: progress/progress.cpp.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Germiona
Гость
« Ответ #4 : Май 30, 2008, 13:28 »

Цитировать
cм. Example: progress/progress.cpp.


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

и в слоте doMenuItem задать id,при котором бы он выполнялся?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Май 30, 2008, 14:52 »

имхо да, вне зависимости он id. Вам ведь все кнопки нужно так обработать?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Germiona
Гость
« Ответ #6 : Июнь 02, 2008, 10:07 »

Нет,такой будет только одна кнопка "Выход", все остальные представляют собой выпадающее меню
Записан
Germiona
Гость
« Ответ #7 : Июнь 02, 2008, 11:39 »

Ерунда какая-то получается,если делать как в примере:

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


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


Pastor, ну вы же гений в фильтрах  Улыбающийся Подскажите как с помощью их сделать
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Июнь 02, 2008, 11:48 »

Покажите код как вы создаете меню
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Germiona
Гость
« Ответ #9 : Июнь 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)));
                                         
}
Записан
Sergeich
Гость
« Ответ #10 : Июнь 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(); 
}
Записан
Germiona
Гость
« Ответ #11 : Июнь 02, 2008, 15:41 »


Sergeich, огромнейшее вам спасибо  Целующий Целующий Целующий,у меня все получилось  Веселый Веселый Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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