LINUX.ORG.RU

Qt


0

0

Есть MainWindow, и есть OtherWindow.

В основном окне есть кнопочка, которая создаёт другое окно. Сделать: если OtherWindow уже открыто, то игнорировать нажатие кнопочки в основном окне.

/**************************************/
MainWindow::MainWindow(QWidget *parent)
	: QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   otherWindowOpened = false;

	connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
}


/**************************************/
void MainWindow::pushButtonClicked(void)
{
	if(!otherWindowOpened)
	{
		ow = new OtherWindow;
		connect(ow, SIGNAL(destroyed(QObject*)), this, SLOT(otherWindowDestroyed(QObject*)));

		ow->show();
		otherWindowOpened = true;
	}
	else
	{
		printf("other window is opened\n");
	}
}


/**************************************/
void MainWindow::otherWindowDestroyed(QObject*)
{
	printf("destroing other window\n");
	otherWindowOpened = false;
}

#############
#############
#############

OtherWindow::OtherWindow(QWidget *parent) :
    QDialog(parent),
    m_ui(new Ui::OtherWindow) .....

Жму кнопочку. Отображается OtherWindow. Закрываю. Ещё раз жму - «other window is opened»

Окно не уничтожается, по всей видимости, а просто закрывается, поэтому destroyed ты не получаешь и otherWindowOpened не изменяется.

smh ★★★
()
Ответ на: комментарий от UVV

Да. Тоже вариант. Спасибо.
Но всё же хотелось бы узнать, что не так в моём примере. Залез в исходник рабочего варианта - всё аналогично, вроде.

markevichus ★★★
() автор топика
Ответ на: комментарий от smh

Т.е. кнопочка X не вызывает destroyed()? Нужен явный close()?

markevichus ★★★
() автор топика

По умолчанию окно после закрытия скрывается, но не прибивается - соответственно сигнал destroyed() не генерируется. Переопределяется это поведение атрибутом WA_DeleteOnClose.

mannaz
()
Ответ на: комментарий от markevichus
class MainWindow
{
    ...
    private:
        QPointer<OtherWindow> ow;
};

////

void MainWindow::pushButtonClicked(void)
{
   if(!ow) // или ow.isNull()
   {
      ow = new OtherWindow;
      ow->show();
   }
   else
   {
      printf("other window is opened\n");
   }
}

Когда ты используешь флаг WA_DeleteOnClose окно удалится, и указатель ow обнулится. Слот otherWindowDestroyed() в этом случае тоже не понадобится. http://doc.trolltech.com/4.5/qpointer.html

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Другой вариант - не удалять/создавать окно при каждом нажатии, а проверять на видимость:

class MainWindow
{
...
private:
  OtherWindow * otherWindow_;
};

MainWindow::MainWindow()
{
  otherWindow_ = 0;
  ...
}

void MainWindow::pushButtonClicked(void)
{
  if ( !otherWindow_ )
    otherWindow_ = new OtherWindow;

  if ( !otherWindow_->isVisible() )
    otherWindow_->show();
  else
    printf("other window is opened\n");
}
Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.