Как сделать всплывающее окно окном верхнего уровня в QT? - PullRequest
1 голос
/ 03 марта 2011

В QT, когда нажимается кнопка и появляется окно, пользователь все равно может вернуться назад и нажать ту же кнопку (бесконечное количество раз).Как сделать так, чтобы всплывающее из кнопки окно оставалось поверх других окон?В этом случае это кнопка «Редактировать», которая открывает окно.

Вот window.cpp

#include "window.h"
#include "editwindow.h"
#include "ui_window.h"
#include <QtGui/QApplication>
#include <QtGui>

Window::Window(QWidget *parent) :
QDialog(parent),
ui(new Ui::Window)
{
ui->setupUi(this);

ShowEdit = new QPushButton(tr("Edit"));
ShowEdit -> show();
connect(ShowEdit, SIGNAL(clicked()), this, SLOT(popup()));

Remove = new QPushButton(tr("Remove"));
Remove -> show();
connect(Remove, SIGNAL(clicked()), this, SLOT(ProgramRemove()));

OK = new QPushButton(tr("OK"));
OK -> show();
connect(OK, SIGNAL(clicked()), this, SLOT(Saved()));

Quit = new QPushButton(tr("Quit"));
Quit -> show();
connect(Quit, SIGNAL(clicked()), this, SLOT(close()));

QLabel *tableLabel = new QLabel(tr("All Programs"));

QVBoxLayout *buttonLayout2 = new QVBoxLayout;
buttonLayout2 -> addWidget(ShowEdit);
buttonLayout2 -> addWidget(Remove);
//buttonLayout2 -> addStretch();

QHBoxLayout *buttonLayout2_2 = new QHBoxLayout;
buttonLayout2_2 -> addWidget(Quit);
buttonLayout2_2 -> addWidget(OK);

/*******************************************************************************/
/***************************Below is for Table**********************************/
/*******************************************************************************/

PTable = new QTableWidget(10, 10);

//PTable ->setHorizontalHeader(tr("Program Names"));
//inputs->setText(QString::number(row));
//PTable->setItem(row, column, inputs);

QHBoxLayout *PTableLayout = new QHBoxLayout;
PTableLayout ->addWidget(PTable);

/*------------------------------------------------------------------------------*/
/*------------------------construct window--------------------------------------*/
/*------------------------------------------------------------------------------*/

QGridLayout *SecondLayout = new QGridLayout;
SecondLayout -> addWidget(tableLabel, 0, 0);
SecondLayout -> addLayout(PTableLayout, 1, 0);
SecondLayout -> addLayout(buttonLayout2, 0, 1);
SecondLayout -> addLayout(buttonLayout2_2, 2, 0);
setLayout(SecondLayout);
setWindowTitle(tr("Settings"));
}

Window::~Window()
{
delete ui;
}

void Window :: popup()
{
EditWindow* window_3 = new EditWindow(this);
window_3->move(QPoint(550, 100));
window_3->show();
window_3->raise();
}

void Window :: closeBoth()
{
return;
}

void Window :: Saved()
{

return;
}

void Window :: ProgramRemove()
{

return;
} 

Ответы [ 2 ]

4 голосов
/ 03 марта 2011

Это потому, что QDialog не является модальным, что означает, что он не блокирует ввод в другие окна.

Вы можете установить это свойство, используя setWindowModality() в QDialog (Описание модальности в QT ).По сути, вы просто делаете следующее:

setWindowModality(Qt::WindowModal);
3 голосов
/ 03 марта 2011

Если EditWindow является QDialog, вы можете вызвать метод exec вместо show.

Из документации Qt:

int QDialog :: exec () [slot]

Показывает диалог как модальное диалоговое окно, блокируя, пока пользователь не закроет его,Функция возвращает результат DialogCode.

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

Таким образом, пользователь не может взаимодействовать с родительским окном, когда открыто окно EditWindow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...