首页 > 编程知识 正文

模态求解,qt设置模态窗口

时间:2023-05-05 13:49:55 阅读:24287 作者:38

q诊断:3360 open () )

考虑到上述问题,我们来比较一下APP应用程序级别的模态实现。 如果窗口模型为Qt :3360非模型,则只需调用QDialog:exec ()即可轻松实现。 那么,为什么不提供类似的函数,只需调用即可实现窗口级的模式对话框呢? 答案是QDialog:open (。 QDialog:open ) )可以打开窗口级别的模式对话框。 在Mac OS X上是sheet。 为了正确实现事件循环,在调用函数时会立即返回。 这意味着必须通过信号时隙机制来实现对返回结果的处理。 幸运的是,q诊断程序提供了finished (信号)。 此信号可正确设置对话框的返回值(如accept )、reject )。 当然,也可以直接继承QDialog使用自己的signal。 现在,对于上面提到的QMessageBox问题,您只需使用show (而不是QMessageBox:open ),即可轻松实现窗口级模式对话框。 Mac OS X平台也不需要指定Qt:Sheet参数。 open ) )函数是一个跨平台,意味着它在所有平台上均如预期般工作。 现在我们有了更完美的映射关系。

q诊断:3360 show (=Qt :3360 non modal

q dialog : exec (=Qt :应用程序模型

q诊断:3360 open (=Qt :3360窗口模型

现在,选择模态类型比以前容易多了。 我再来说明一个令人困惑的问题。

子类的静态函数

新的open ) )提供函数的另一个目的是避免误用sheet。 这意味着不需要手动设置Qt:Sheet参数。 此外,如果需要打开“APP应用程序级别”模式下的sheet,则会出现一个常规的“APP应用程序级别”模式对话框,这意味着在打开“窗口级别模式”对话框时,系统将为您打开sheet。 这是因为除了sheet之外,Cocoa无法打开窗口级的模态普通对话框。

sheet在所有APP应用程序级别的模式对话框中不可用这一事实表明,所有的QDialog,包括QColorDialog、QFontDialog、QFileDialog、QInputDialog和QMessageBox 请考虑QColorDialog:getColor (等函数之一。 此函数创建QColorDialog对话框并将其显示在模态中。 每个函数的返回值都是用户从对话框中选择的颜色。 如果用户未选择,则返回错误的颜色值。 这些函数的问题是无法使用sheet,因为它们提供了APP应用程序级别的模态。 使用QFileDialog的一些用户可能会对此感到困惑。 因为在Mac OS X上,Qt的QFileDialog确实是sheet。 这是因为在Mac OS X上,APP应用程序可以将QFileDialog用作表。

QDialog:open ()支持三种模式类型。 现在,让我们看看是否有其他函数。 确实,为了实现过去需要很多代码的功能,可以看到open ()的很多重载版本。 许多子类可以很容易地将处理返回值的slot添加到open ()函数中。 这些对话框可以进行适当的连接,不需要我们处理。 以下是这些重载版本的列表。

qile dialog :3360 open (q object * receiver,const char *slot );

qolordialog :3360 open (q object * receiver,const char *slot );

qontdialog :3360 open (q object * receiver,const char *slot );

q打印诊断程序:3360打开(q object * receiver,const char *slot );

qagesetupdialog :3360 open (q object * rec,常数char * slot );

qinputdialog :3360 open (q object * receiver,const char *slot );

qprogressdialog :3360打开(q object * receiver,const char *slot );

qprintpreviewdialog :3360 open (q object * rec,常数char * slot );

这些函数的目的是使最常见的处理函数易于连接。 让我们看看这些连接是如何连接的。

QColorDialog将传递的时隙连接到颜色选择(q color )信号;

QFontDialog与字体选择(q font )信号连接;

根据模式的不同,QFileDialog连接到文件选定(qstring或filesSelected(QStringList信号)

QProgressDia

log连接到canceled()信号。

你可以从 Qt 文档中获得更详细的信息。在open()中指定响应的 slot 可以很好的简化代码。利用这种方法,你可以直接打开一个 native 的对话框,现在提供这个功能的类是QFileDialog,QColorDialog,QFontDialog和QPrintDialog。

新的交互形式

既然我们可以使用open()打开一个 native 的对话框,我们就应该可以类似的使用show()打开一个 native 的非模态对话框。初看起来,这么做并没有什么用,但是它可以在 Mac OS X 下打开一个标准的“live feedback”对话框。这在 Qt 中相当简单。

QDialog子类提供的 static 函数鼓励开发者使用这么一种方式:阻止用户继续工作,并且询问一个问题(例如,“你想用哪个字体?”)。但是,有一定程度上,这将影响到用户的工作,甚至惹恼用户。想象一下用户要使用QColorDialog选择颜色的情景。他需要打开对话框,点击选择颜色,关闭对话框,然后才能看到效果如何。如果他们不满意选择的颜色,则不得不重新进行上面的工作。很显然,这种繁复的工作通常很讨厌,为什么不设计成对话框一直显示在那里,让用户选择好颜色之后就可以马上看到效果呢?一种解决方案是,自己创建一个非模态对话框,实现前面所说的工作。例如在字体选择时,Qt 有一个QFontComboBox类,允许以非模态方式选择字体。但它不可能实现QFontDialog所能做的所有事情。使用对话框更为直观。为了达到这一目的,QFontDialog类提供了QFontDialog::currentFontChanged()信号。我们可以连接到这个信号,然后使用show()提供非模态对话框。这样,我们就有了一个不会打扰用户操作的对话框,能够立刻将相应返回给窗口。QColorDialog同样有类似的方法。这种实现可以让用户感觉程序更加友好。我们以颜色选择为例,看看如何实现这种方式。

class MainWindow

{

Q_OBJECT

//...

private:

// ...

QColorDialog *globalColorDialog;

// ...

};

class PaintArea

{

Q_OBJECT

//...

public slots:

void setBrushColor(const QColor &color);

// ...

};

我们不能使用QColorDialog提供的 static 函数,而是保持一个QColorDialog的指针。为此,我们在主窗口添加一个指针,并且要在组件中添加 slot 函数(这里就是QPaintAreas::setBrushColor())。

void MainWindow::brushColor()

{

if (!globalColorDialog) {

globalColorDialog = new QColorDialog(this);

globalColorDialog->setCurrentColor(paintArea->brushColor());

globalColorDialog->setOption(

QColorDialog::NoButtons, true);

connect(globalColorDialog,

SIGNAL(currentColorChanged(QColor)),

paintArea,

SLOT(setBrushColor(QColor)));

}

globalColorDialog->show();

}

我们需要将选择的颜色设置给当前画笔。使用QColorDialog::NoButtons以避免 OK 和 Cancel 按钮出现。这主要是因为在这种实现方式中,它们并没有什么意义,因为我们要将选择的颜色立即返回给画笔(取消按钮是不能撤销颜色选择的)。但是,在 X11 的某些窗口管理器上,没有关闭按钮的窗口会变得很奇怪,这一点值得注意。最后,我们创建currentColorChanged()和setBrushColor()的信号槽连接。然后调用show()函数显示对话框。如果对话框已经显示,则简单地将其放置在窗口最顶层。

对于QFontDialog也是类似的,没有什么区别。我们创建一个字体对话框,通过保持其指针来做信号槽连接。

结论

这篇文章阐述了一些使用QDialog的新的方法。我们着重讲述了各种模态的实现,以及一些有用的技巧。这里提到的函数有些是 Qt 4.5 之后新增加的,例如QDialog::open(),这些函数都很有用,所以我们应该在自己的程序中多多使用,而不是固守于旧的接口。毕竟,我们的程序也需要与时俱进的~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。