crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Некорректная работа кнопки
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  


Цитата(Trisch @ 18.10.2014, 22:20) *
А как вы закрываете окно, при нажатии на кнопку? В коде я этого не нашел :(

Может я не так что то делаю, но окно не закрывается кнопкой, а только открываетя. В окне установлен флаг 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  


Цитата(marsel @ 18.10.2014, 23:40) *
Всё правильно, когда мы нажимаем за границу окна по кнопке у нас должны вызываться действия в следующим порядке:

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  


Цитата(Trisch @ 19.10.2014, 12:19) *
Закрытие диалогового окна при нажатии кнопки мыши за его приделами, это обязательное условие?

Для начала откажитесь от триггерной кнопки, как по мне это лишний гемор.

Как вариант можно сделать так:

1. Нажимаете на кнопку, запускаете диалоговое окно, кнопку делаете не активной.
2. При закрытии окна посылаете сигнал, который делает ее снова активной.


Как вариант это работает причем правильно но, когда я добавляю изменение позиции окна вот таким образом window->move(this->mapToGlobal(QPoint(button->x() - 33, button->y() + 22))) то я получаю тот же эффект с кнопкий что и 1-вом варианте, и не могу понять почему. Я за неделю перепробовал все что можно было придумать. Так что думаю мне наврятли поможет другое решение за ислючением помощи в решении проблемы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.4.2024, 18:38