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两者之间没有直接关系。
QWidgetQWidget类是所有用户界面对象的基类。
窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且将自己的表现形式绘制在屏幕上。每一个窗口部件都是矩形,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
QWidget有很多成员函数,但是它们中的一些有少量的直接功能:例如,QWidget有字体属性,但是自己从来不用。为很多继承它的子类提供了实际的功能,比如QLabel、QPushButton、QCheckBox等等。
没有父窗体的小部件始终是一个独立的窗口(顶级窗口部件)。非窗口的小部件为子部件,它们在父窗口中显示。Qt中大多数部件主要被用作子部件。例如:可以显示一个按钮作为顶层窗口,但大多数人更喜欢将按钮内置于其它部件,如QDialog。
QDialogQDialog类是对话框窗口的基类。
对话框窗口是一个顶级窗体,主要用于短期任务以及和用户进行简要通讯。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()addAction( "&Exit"
, this , SLOT(close()) , QKeySequence::Close ) ;
/*toolBar工具栏*/
QToolBar *toolBar = this->addToolBar( "mimi" ) ;
toolBar->addAction( openAction ) ;
toolBar->addAction( saveAction ) ;
toolBar->addAction( closeAction ) ;
/*statusBar状态栏*/
QStatusBar *statusBar = this->statusBar() ;
QLabel *label ;
statusBar->addWidget( label = new QLabel("Ok") ) ;
label->setText( "XXXXX... ..." ) ;
/*上面的三种栏介绍完之后,剩下的窗口区域就是CentralWidget
**如果将widget直接add到mainwindow这个窗口的话,
**toolbar是会跟添加进来的widget重叠的*/
MyView *view = new MyView ;
this->setCentralWidget( view ) ;
/*最后就是window系统右下脚的托盘:system tray icon*/
QSystemTrayIcon *icon = 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==QSystemTrayIcon::Trigger ) {
if( this->isHidden() )
this->show() ;
else
this->hide() ;
}
}
bool MyWindow::eventFilter(QObject *o, QEvent *e)
{
/*实现什么功能呢?*/
if(o == (QObject*)this && e->type() == QEvent::Close)
{
return true;
}
return QMainWindow::eventFilter(o, e);
}
void MyWindow::slotOpen() {
QString fileName = QFileDialog::getOpenFileName() ;
qDebug()exec( QCursor::pos() ) ;
}
}
MyWindow::~MyWindow(void) { }
使用原则
如果需要嵌入到其他窗体中,则基于QWidget创建。
如果是顶级对话框,则基于QDialog创建。
如果是主窗体,则基于QMainWindow创建。
转自:qt 中Dialog mainwindow widget 之间的联系和区别_ppipp1109的博客-CSDN博客_mainwindow和widget区别