热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

qt中DialogMainWindowWidget之间的联系和区别

dialog、widget、mainwindow的区别1、dialog有exec函数,如果是dialog窗口,后边的窗口时不可选的;2、


dialog、widget、mainwindow的区别  

1、dialog有exec函数,如果是dialog窗口,后边的窗口时不可选的;
2、widget和dialog都有show函数,如果通过这个函数显示这两种类型的窗口,则两个窗口都是可选的;
3、widget主要是在上面放置布局和控件;
4、mainwindow可以显示菜单,工具栏,状态栏、托盘等功能。

注意:

1、查看帮助文档可以发现,setMenuBar、addToolBar、setCentralWidget、setStatusBar几种行为只有QMainWindow类具有。 

因此,在继承自QWidget类的用户类中无法创建菜单栏等几种行为。 

这就是QMainWindow和QWidget的主要区别。

2、QWidget继承于QObject和QPaintDevice,QDialog和QMainWindow则继承于QWidget,QDialog、QMainWindow两者之间没有直接关系。


QWidget

QWidget类是所有用户界面对象的基类。

窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且将自己的表现形式绘制在屏幕上。每一个窗口部件都是矩形,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。

QWidget有很多成员函数,但是它们中的一些有少量的直接功能:例如,QWidget有字体属性,但是自己从来不用。为很多继承它的子类提供了实际的功能,比如QLabel、QPushButton、QCheckBox等等。

没有父窗体的小部件始终是一个独立的窗口(顶级窗口部件)。非窗口的小部件为子部件,它们在父窗口中显示。Qt中大多数部件主要被用作子部件。例如:可以显示一个按钮作为顶层窗口,但大多数人更喜欢将按钮内置于其它部件,如QDialog。


QDialog

QDialog类是对话框窗口的基类

对话框窗口是一个顶级窗体,主要用于短期任务以及和用户进行简要通讯。QDialog可以是模式的也可以是非模式的。QDialog支持扩展性并且可以提供返回值。它们可以有默认按钮。QDialog也可以有一个QSizeGrip在它的右下角,使用setSizeGripEnabled()。

注意:QDialog(以及其它使用Qt::Dialog类型的widget)使用父窗口部件的方法和Qt中其它类稍微不同。对话框总是顶级窗口部件,但是如果它有一个父对象,它的默认位置就是父对象的中间。它也将和父对象共享工具条条目

#include "mydialog.h"

mydialog::mydialog(QDialog *parent):QDialog(parent) {

QPushButton *button = new QPushButton( "button" , this ) ;
connect( button , SIGNAL(clicked()) , this , SLOT(slotButtonClick()) ) ;
}

void mydialog::slotButtonClick() {

#if 0
/*dialog和widget的区别,exec和show的区别而已*/
QDialog *dlg = new QDialog ;
QPushButton *button = new QPushButton("close" , dlg ) ;
connect( button , SIGNAL(clicked()) , dlg , SLOT(reject()) ) ;
int ret = dlg->exec( ) ;
//通过exec显示出来的窗口称为,模块对话框
// 在模块对话框中,exec有自己的消息循环,并且把app的消息循环接管了
// 如果Dialog是通过exec来显示,那么可以通过accept或者reject来关闭窗口
// 如果Dialog是通过show来显示,那么可以通过close来关闭窗口,这个和QWidget一样的

// 有许多特殊的dailog:文件选择,MessageBox,颜色选择,字体选择,打印预览,打印
if( ret == QDialog::Accepted )
qDebug()<<"accepted" ;
else if( ret&#61;&#61; QDialog::Rejected )
qDebug()<<"rejected" ;
#endif
#if 0
/*文件选择&#xff1a;这个窗口可以选择保存文件的名称&#xff0c;然后将路径&#43;名称返回&#xff0c;我们就可以根据返回路径名来保存文件。*/
QString strFilename &#61; QFileDialog::getSaveFileName(NULL,
"Select file for save",
_strDir,
"pic file (*.png *.jpg)");
#endif
#if 0
/*文件选择&#xff1a;选择要打开的文件名&#xff08;绝对路劲&#xff09;&#xff1b;我们就可以根据这个文件路径来打开相应的文件*/
QString strFilename &#61; QFileDialog::getOpenFileName(NULL,
"Select file for open",
_strDir,
"pic file (*.png *.jpg)");
#endif
#if 0
QString strFilename &#61; QFileDialog::getExistingDirectory();

if(strFilename.isEmpty())
{
qDebug() <<"select none";
return;
}

qDebug() < QFileInfo fileInfo(strFilename);
_strDir &#61; fileInfo.filePath();
qDebug() <<_strDir;
#endif
//do something for io ... ...
//上面的选择将绝对路径名都给拿下来了&#xff0c;如果要进行保存&#xff0c;不是很容易吗&#xff01;
QPixmap pixmap(this->size()) ;
QPainter painter(&pixmap) ;
this->render( &painter ) ;
pixmap.save(strFilename) ;
#if 0
/*颜色选择对话框&#xff1a;可以选择相应的颜色&#xff1b;然后将选择的颜色返回&#xff0c;这样我们就可以操作了*/
QColorDialog colorDia ;
colorDia.exec() ;
QColor c &#61; colorDia.selectedColor() ;
#endif
#if 0
/*字体选择对话框&#xff1a;可以选择字体&#xff1b;然后将选择的字体信息返回&#xff0c;我们同样可以用这些信息来设置相应的值*/
QFontDialog fontDia ;
fontDia.exec() ;
QFont font &#61; fontDia.selectedFont() ;
#endif
#if 0
/*这个也是弹窗对话框&#xff0c;不过只是简单的选择以下枚举中的值&#xff0c;可以尝试下效果*/
int ret &#61; QMessageBox::question(this, "????", "realy do .......",
QMessageBox::Yes| QMessageBox::No|
QMessageBox::YesAll| QMessageBox::NoAll);
if(ret &#61;&#61; QMessageBox::Yes)
{
qDebug() <<"user select yes";
}
if(ret &#61;&#61; QMessageBox::No)
{
qDebug() <<"user select no";
}
#endif
}


void mydialog::paintEvent( QPaintEvent *ev ) {
}


mydialog::~mydialog(void) { }

模式对话框

阻塞同一应用程序中其它可视窗口输入的对话框。模式对话框有自己的事件循环&#xff0c;用户必须完成这个对话框中的交互操作&#xff0c;并且关闭了它之后才能访问应用程序中的其它任何窗口。模式对话框仅阻止访问与对话相关联的窗口&#xff0c;允许用户继续使用其它窗口中的应用程序。

显示模态对话框最常见的方法是调用其exec()函数&#xff0c;当用户关闭对话框&#xff0c;exec()将提供一个有用的返回值&#xff0c;并且这时流程控制继续从调用exec()的地方进行。通常情况下&#xff0c;要获得对话框关闭并返回相应的值&#xff0c;我们连接默认按钮&#xff0c;例如&#xff1a;”确定”按钮连接到accept()槽&#xff0c;”取消”按钮连接到reject()槽。另外我们也可以连接done()槽&#xff0c;传递给它Accepted或Rejected。


非模式对话框

和同一个程序中其它窗口操作无关的对话框。在文字处理中的查找和替换对话框通常是非模式的&#xff0c;允许用户同时与应用程序的主窗口和对话框进行交互。调用show()来显示非模式对话框&#xff0c;并立即将控制返回给调用者。

如果隐藏对话框后调用show()函数&#xff0c;对话框将显示在其原始位置&#xff0c;这是因为窗口管理器决定的窗户位置没有明确由程序员指定&#xff0c;为了保持被用户移动的对话框位置&#xff0c;在closeEvent()中进行处理&#xff0c;然后在显示之前&#xff0c;将对话框移动到该位置。


半模式对话框

调用setModal(true)或者setWindowModality()&#xff0c;然后show()。有别于exec()&#xff0c;show() 立即返回给控制调用者。

对于进度对话框来说&#xff0c;调用setModal(true)是非常有用的&#xff0c;用户必须拥有与其交互的能力&#xff0c;例如&#xff1a;取消长时间运行的操作。如果使用show()和setModal(true)共同执行一个长时间操作&#xff0c;则必须定期在执行过程中调用QApplication::processEvents()&#xff0c;以使用户能够与对话框交互&#xff08;可以参考QProgressDialog&#xff09;。


QMainWindow

QMainWindow类提供一个有菜单条、工具栏、状态条的主应用程序窗口&#xff08;例如&#xff1a;开发Qt常用的IDE-Visual Studio、Qt Creator等&#xff09;。

一个主窗口提供了构建应用程序的用户界面框架。Qt拥有QMainWindow及其相关类来管理主窗口。

QMainWindow拥有自己的布局&#xff0c;我们可以使用QMenuBar&#xff08;菜单栏&#xff09;、QToolBar&#xff08;工具栏&#xff09;、QStatusBar&#xff08;状态栏&#xff09;以及QDockWidget&#xff08;悬浮窗体&#xff09;&#xff0c;布局有一个可由任何种类小窗口所占据的中心区域。

#include "MyWindow.h"


MyWindow::MyWindow(QMainWindow *parent):QMainWindow( parent ) {

/*menuBar菜单栏&#xff0c;菜单menu*/
QMenuBar *menuBar &#61; this->menuBar() ;
_menu &#61; menuBar->addMenu( "&File" ) ;
QMenu *edit &#61; menuBar->addMenu( "&Edit" ) ;

/*menu菜单中的选项action*/
QAction *openAction &#61; _menu->addAction( "&Open"
, this , SLOT(slotOpen()) , QKeySequence::Open ) ;
QAction *saveAction &#61; _menu->addAction( "&Save"
, this , SLOT(slotOpen()) , QKeySequence::Save ) ;
_menu->addSeparator() ;//添加分界线
QAction *closeAction &#61; _menu->addAction( "&Exit"
, this , SLOT(close()) , QKeySequence::Close ) ;

/*toolBar工具栏*/
QToolBar *toolBar &#61; this->addToolBar( "mimi" ) ;
toolBar->addAction( openAction ) ;
toolBar->addAction( saveAction ) ;
toolBar->addAction( closeAction ) ;
/*statusBar状态栏*/
QStatusBar *statusBar &#61; this->statusBar() ;
QLabel *label ;
statusBar->addWidget( label &#61; new QLabel("Ok") ) ;
label->setText( "XXXXX... ..." ) ;
/*上面的三种栏介绍完之后&#xff0c;剩下的窗口区域就是CentralWidget
**如果将widget直接add到mainwindow这个窗口的话&#xff0c;
**toolbar是会跟添加进来的widget重叠的*/
MyView *view &#61; new MyView ;
this->setCentralWidget( view ) ;
/*最后就是window系统右下脚的托盘&#xff1a;system tray icon*/
QSystemTrayIcon *icon &#61; new QSystemTrayIcon ;
icon->setIcon( QIcon("./1.png") ) ;//图标
icon->setToolTip( "luck dog" ) ;//鼠标滑过提示文字
icon->show() ;//展示在右下角
icon->setContextMenu( _menu ) ;//右击出现的菜单
this->connect( icon , SIGNAL( slotActivated(QSystemTrayIcon::ActivationReason) )
, this , SLOT(slotActivated(QSystemTrayIcon::QSystemTrayIcon::ActivationReason)) ) ;
this->installEventFilter(this);
}


void MyWindow::slotActivated(QSystemTrayIcon::ActivationReason reason){

/*这个没成功*/
if( reason&#61;&#61;QSystemTrayIcon::Trigger ) {
if( this->isHidden() )
this->show() ;
else
this->hide() ;
}
}


bool MyWindow::eventFilter(QObject *o, QEvent *e)
{
/*实现什么功能呢&#xff1f;*/
if(o &#61;&#61; (QObject*)this && e->type() &#61;&#61; QEvent::Close)
{
return true;
}

return QMainWindow::eventFilter(o, e);
}


void MyWindow::slotOpen() {

QString fileName &#61; QFileDialog::getOpenFileName() ;
qDebug()< /*将打开的文件中的内容显示在窗口上... ...*/
}
bool MyWindow::event(QEvent *ev)
{
qDebug() < if(ev->type() &#61;&#61; QEvent::Close) {
return false;
}
/*怎么弄才能实现窗口关闭&#xff0c;托盘还在&#xff1f;*/
return QMainWindow::event(ev);
}


void MyWindow::paintEvent( QPaintEvent * ) {

QPainter painter(this) ;
painter.drawPixmap( QPoint(0,0) , QPixmap("./1.png") ) ;
}


void MyWindow::mousePressEvent( QMouseEvent *ev ) {

if( ev->button() &#61;&#61; Qt::RightButton ) {
_menu->exec( QCursor::pos() ) ;
}
}


MyWindow::~MyWindow(void) { }

使用原则


如果需要嵌入到其他窗体中&#xff0c;则基于QWidget创建。


如果是顶级对话框&#xff0c;则基于QDialog创建。


如果是主窗体&#xff0c;则基于QMainWindow创建。


转自&#xff1a;qt 中Dialog mainwindow widget 之间的联系和区别_ppipp1109的博客-CSDN博客_mainwindow和widget区别



推荐阅读
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本文深入探讨了 Delphi 中类对象成员的核心概念,包括 System 单元的基础知识、TObject 类的定义及其方法、TClass 的作用以及对象的消息处理机制。文章不仅解释了这些概念的基本原理,还提供了丰富的补充和专业解答,帮助读者全面理解 Delphi 的面向对象编程。 ... [详细]
  • 本文提供了手势解锁功能的详细实现方法和源码下载链接。通过分析手势解锁的界面和逻辑,详细介绍如何在iOS应用中实现这一功能。 ... [详细]
  • 本文介绍如何利用QFileSystemModel进行目录的浏览、创建及删除操作,并提供了一个简单的对话框界面实现。 ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • js常用方法(1)startWithJava代码varstartsWithfunction(str,regex){if(regexundefined||strundefined|| ... [详细]
  • 本文将探讨从ASP.NET 1.1到2.0期间编译系统的重要变革。通过对比两个版本的即时编译模型,我们将揭示2.0版本中引入的新特性和改进之处。 ... [详细]
  • 本文介绍了如何使用XMLHttpRequest对象进行简单的异步请求,并详细描述了从创建对象到发送请求及处理响应的全过程。 ... [详细]
  • 开发笔记:Python:GUI之tkinter学习笔记1控件的介绍及使用
    开发笔记:Python:GUI之tkinter学习笔记1控件的介绍及使用 ... [详细]
  • Java程序设计第五周学习总结与实践
    本次学习总结涵盖了本周在Java程序设计课程中的学习要点,包括代码阅读、抽象类的应用、接口的使用以及面向接口编程的概念。同时,还包括了具体的书面作业解析。 ... [详细]
  • 从Android 3.0 (API Level 11)起,Android的2D渲染管道得到了改进,以更好地支持硬件加速。本文介绍了如何启用和管理硬件加速,以及其对应用性能的影响。 ... [详细]
  • Android Studio 中 Activity 组件详解
    本文介绍了 Android 开发中 Activity 的基本概念、生命周期、状态转换以及如何创建和管理 Activity。通过详细的解释和示例代码,帮助开发者更好地理解和使用 Activity。 ... [详细]
author-avatar
手机用户2502909581
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有