Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Некорректная работа кнопки
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
Gima
Всем доброго времени суток. Несколько дней не могу решить одну проблему суть которой такова. Есть конопка (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
А как вы закрываете окно, при нажатии на кнопку? В коде я этого не нашел :(
Gima
Цитата(Trisch @ 18.10.2014, 22:20) *
А как вы закрываете окно, при нажатии на кнопку? В коде я этого не нашел :(

Может я не так что то делаю, но окно не закрывается кнопкой, а только открываетя. В окне установлен флаг Qt::Popup т.е при любом нажатии мышкой вне границ окна оно закрывается. При попытке нажать на кнопку что бы закрыть, окно закрывается потому что происходит клик вне его границ из за установленного флага Qt::Popup, а потом уже происходит "бессмысленное" нажатие на кнопку которое просто должно установить ее в false и => отжать.

там ошибка в mainwindow.cpp должно быть так

void MainWindow::buttonCheckable()
{
if(button->isChecked())
button->setChecked(false);
}

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

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

1) срабатывает buttonCheckable() и кнопка становится отжатой false
2) срабатывает сигнал у кнопки toggle(false)
3) срабатывает сигнал у кнопки toggle(true) так как мы всё таки нажали в область кнопки и кнопка становится нажатой и диалоговое окно снова показывается


1) срабатывает buttonCheckable() и кнопка становится отжатой false (нужно для того что бы перевести кнопку в false если окно будет закрыто нажатием не в область кнопки)

Я понимаю что эти действия происходят но немогу понять как организовать все так что бы оно неоткрывалось заново. Пререпробовал массу вариантов но рабочего результата так и не получил. По этому и спашиваю, может кто знает как сделать правильно.
Trisch
Закрытие диалогового окна при нажатии кнопки мыши за его приделами, это обязательное условие?

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

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

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

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

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

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


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