如何在QT中将弹出窗口设为顶级窗口?

时间:2011-03-03 00:24:30

标签: c++ qt user-interface

在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 个答案:

答案 0 :(得分:4)

这是因为QDialog不是模态的,这意味着它不会阻止对其他窗口的输入。

您可以使用setWindowModality()Description of Modality in QT)中的QDialog来设置此媒体资源。基本上你只需要做以下事情:

setWindowModality(Qt::WindowModal);

答案 1 :(得分:3)

如果EditWindowQDialog,您可以调用exec方法而不是show。

来自Qt文档:

  

int QDialog :: exec()[slot]

     

将对话框显示为模式对话框,   阻止,直到用户关闭它。该   function返回DialogCode结果。

     

如果对话框是应用程序模式,   用户无法与任何其他用户进行互动   窗口在同一个应用程序中直到   他们关闭对话框。如果是对话框   是窗口模态,只与...交互   父窗口被阻止了   对话框已打开。默认情况下,该对话框   是申请模式。

这样,当EditWindow打开时,用户无法与父窗口进行交互。