Некорректная работа кнопки |
Здравствуйте, гость ( Вход | Регистрация )
Некорректная работа кнопки |
Gima |
18.10.2014, 20:49
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 18.10.2014 Пользователь №: 4253 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всем доброго времени суток. Несколько дней не могу решить одну проблему суть которой такова. Есть конопка (setCheckable(true)) при нажатии на которую появляеться новое окно, у окна установлен флаг окна (setWindowFlags(Qt::Popup) т.е при нажатии вне его границ оно закрывается), требуеться сделать следующее: при нажатии на кнопку открывать новое окно ( кнопка отмечаеться как true), при повторном нажатии окно закрываеться (кнопка отмечается как false), при нажатии вне границ окна оно закрывается и кнопка отмечается как false. Реализовал все но возникла проблема в том что при повторном нажатии окно закрывается и сново открывается, хотя просто должно закрыться. Уважаемые форумчане помогите разобраться с данное проблемой. Перепробовал множество вариантов и так не пришел к решения этой проблемы. Вот код:
dialog.h Раскрывающийся текст #ifndef DIALOG_H #define DIALOG_H #include <QDialog> namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog(); private: Ui::Dialog *ui; protected: void closeEvent(QCloseEvent *); signals: void closeWindow(); }; #endif // DIALOG_H mainwindow.h Раскрывающийся текст #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPushButton> #include <QDebug> #include "dialog.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; Dialog *window; QPushButton *button; private slots: void showWindow(bool st); void buttonCheckable(); }; #endif // MAINWINDOW_H dialog.cpp Раскрывающийся текст #include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); this->setWindowFlags(Qt::Popup); } Dialog::~Dialog() { delete ui; } void Dialog::closeEvent(QCloseEvent *) { emit closeWindow(); } mainwindow.cpp Раскрывающийся текст #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); window = new Dialog(this); button = new QPushButton("Show window"); button->setCheckable(true); ui->mainToolBar->addWidget(button); connect(button, SIGNAL(toggled(bool)), this, SLOT(showWindow(bool))); connect(window, SIGNAL(closeWindow()), this, SLOT(buttonCheckable())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::showWindow(bool st) { if(st) { window->show(); window->move(this->mapToGlobal(QPoint(button->x() - 33, button->y() + 22))); } } void MainWindow::buttonCheckable() { if(!button->isChecked()) button->setChecked(false); } |
|
|
Trisch |
18.10.2014, 22:20
Сообщение
#2
|
Активный участник Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: 0 |
А как вы закрываете окно, при нажатии на кнопку? В коде я этого не нашел
|
|
|
Gima |
18.10.2014, 23:23
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 18.10.2014 Пользователь №: 4253 Спасибо сказали: 0 раз(а) Репутация: 0 |
А как вы закрываете окно, при нажатии на кнопку? В коде я этого не нашел Может я не так что то делаю, но окно не закрывается кнопкой, а только открываетя. В окне установлен флаг Qt::Popup т.е при любом нажатии мышкой вне границ окна оно закрывается. При попытке нажать на кнопку что бы закрыть, окно закрывается потому что происходит клик вне его границ из за установленного флага Qt::Popup, а потом уже происходит "бессмысленное" нажатие на кнопку которое просто должно установить ее в false и => отжать. там ошибка в mainwindow.cpp должно быть так void MainWindow::buttonCheckable() { if(button->isChecked()) button->setChecked(false); } т.е без инверсии |
|
|
marsel |
18.10.2014, 23:40
Сообщение
#4
|
Студент Группа: Новичок Сообщений: 15 Регистрация: 29.1.2013 Пользователь №: 3693 Спасибо сказали: 3 раз(а) Репутация: 0 |
Всё правильно, когда мы нажимаем за границу окна по кнопке у нас должны вызываться действия в следующим порядке:
1) срабатывает buttonCheckable() и кнопка становится отжатой false 2) срабатывает сигнал у кнопки toggle(false) 3) срабатывает сигнал у кнопки toggle(true) так как мы всё таки нажали в область кнопки и кнопка становится нажатой и диалоговое окно снова показывается |
|
|
Gima |
18.10.2014, 23:53
Сообщение
#5
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 18.10.2014 Пользователь №: 4253 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всё правильно, когда мы нажимаем за границу окна по кнопке у нас должны вызываться действия в следующим порядке: 1) срабатывает buttonCheckable() и кнопка становится отжатой false 2) срабатывает сигнал у кнопки toggle(false) 3) срабатывает сигнал у кнопки toggle(true) так как мы всё таки нажали в область кнопки и кнопка становится нажатой и диалоговое окно снова показывается 1) срабатывает buttonCheckable() и кнопка становится отжатой false (нужно для того что бы перевести кнопку в false если окно будет закрыто нажатием не в область кнопки) Я понимаю что эти действия происходят но немогу понять как организовать все так что бы оно неоткрывалось заново. Пререпробовал массу вариантов но рабочего результата так и не получил. По этому и спашиваю, может кто знает как сделать правильно. |
|
|
Trisch |
19.10.2014, 12:19
Сообщение
#6
|
Активный участник Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: 0 |
Закрытие диалогового окна при нажатии кнопки мыши за его приделами, это обязательное условие?
Для начала откажитесь от триггерной кнопки, как по мне это лишний гемор. Как вариант можно сделать так: 1. Нажимаете на кнопку, запускаете диалоговое окно, кнопку делаете не активной. 2. При закрытии окна посылаете сигнал, который делает ее снова активной. Сообщение отредактировал Trisch - 19.10.2014, 12:20 |
|
|
Gima |
19.10.2014, 13:02
Сообщение
#7
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 18.10.2014 Пользователь №: 4253 Спасибо сказали: 0 раз(а) Репутация: 0 |
Закрытие диалогового окна при нажатии кнопки мыши за его приделами, это обязательное условие? Для начала откажитесь от триггерной кнопки, как по мне это лишний гемор. Как вариант можно сделать так: 1. Нажимаете на кнопку, запускаете диалоговое окно, кнопку делаете не активной. 2. При закрытии окна посылаете сигнал, который делает ее снова активной. Как вариант это работает причем правильно но, когда я добавляю изменение позиции окна вот таким образом window->move(this->mapToGlobal(QPoint(button->x() - 33, button->y() + 22))) то я получаю тот же эффект с кнопкий что и 1-вом варианте, и не могу понять почему. Я за неделю перепробовал все что можно было придумать. Так что думаю мне наврятли поможет другое решение за ислючением помощи в решении проблемы. |
|
|
Текстовая версия | Сейчас: 26.4.2024, 18:38 |