QDialog窗口和Widget窗口类似,都是以桌面的方式进行显示窗口的,只是有些许控件不同,请看详细代码。
头文件MyQDialog.h
#ifndef MYQDIALOG_H #define MYQDIALOG_H #include<QDialog> class MyQDialog : public QDialog { Q_OBJECT public: explicit MyQDialog(QWidget *parent=0); void paintEvent(QPaintEvent *); signals: public slots: void slotOpenNewWindow(); }; #endif // MYQDIALOG_H
源文件MyQDialog.cpp
#include "myqdialog.h" #include<QApplication> #include<QPushButton> #include<QDebug> #include<QFileDialog> //文件选择对话框 #include<QFileInfo> #include<QColorDialog> //颜色选择对话框 #include<QFontDialog> //字体选择对话框 #include<QColor> #include<QLabel> #include<QMessageBox> //提示框 #include<QPainter> MyQDialog::MyQDialog(QWidget *parent) : QDialog(parent) { QPushButton *button = new QPushButton("Click me", this); connect(button, SIGNAL(clicked()), this, SLOT(slotOpenNewWindow())); } void MyQDialog::slotOpenNewWindow() { #if 0 QDialog *dlg = new QDialog(); QPushButton *button1 = new QPushButton("New Button", dlg); connect(button1, SIGNAL(clicked()), dlg, SLOT(accept())); //关闭窗口 int num = dlg->exec(); //此时打开一个新窗口,且旧窗口不能被操作,因为之处出于死循环之中,exec是有返回值的 //如果Dialog是通过exec来显示的,那么可以通过accept或者reject来关闭窗口,比QWidget多了一个exec函数来显示窗口 //如果Dialog是通过show来显示的,那么可以通过close来关闭窗口,这个和QWidget一样的 // dlg->show(); //打开一个新窗口,新旧窗口之间相互独立 if(num == QDialog::Accepted) { qDebug()<<"Accecpted"; } else if(num == QDialog::Rejected) //关闭新窗口时打印Reject { qDebug()<<"Rejected"; } //有许多特殊的dialog:文件选择,MessageBox,颜色选择,字体选择,打印预览,打印,都是系统提供的 #endif #if 0 /* static QString getSaveFileName(QWidget *parent = 0, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = 0, Options options = 0); */ QString _strDir; //选择要打开的文件,第一个参数为父类,第二个参数为标题,第三个参数文件路径,第四个为过滤文件(如通过后缀) QString fileName = QFileDialog::getOpenFileName(this, "Select file to save", _strDir, "File (*.jpg *.doc)"); if(fileName == "") { qDebug()<<"select none!"; } qDebug()<<fileName; QFileInfo fileInfo(fileName); //保存上次查找的路径,以便下次查找时直接进入该路径 _strDir = fileInfo.filePath(); #endif #if 0 QColorDialog colorDialog; //颜色选择窗口 colorDialog.exec(); QColor c = colorDialog.selectedColor(); QFontDialog fontDialog; //字体设置窗口 fontDialog.exec(); QFont f = fontDialog.selectedFont(); #endif //用静态函数即可,提示一个警告 // QMessageBox::warning(this, "Error", "Error occurs..."); //警告 // QMessageBox::information(this, "info", "Infomation"); //消息提示 // QMessageBox::critical(this, "critical", "critical"); //致命的小气 // int ret = QMessageBox::question(this, "question?","my question"); //这时候只有两个窗口 //可以通过以下这种方式增加按钮, 通过或增加多个按钮 int ret = QMessageBox::question(this, "Question", "Question...", QMessageBox::Yes | QMessageBox::No | QMessageBox::YesToAll | QMessageBox::NoToAll); if (ret == QMessageBox::Yes) qDebug()<<"Yes"; if(ret == QMessageBox::No) qDebug()<<"No"; if(ret == QMessageBox::YesToAll) qDebug()<<"YestoALl"; } //在QDialog里边同样可以画图 void MyQDialog::paintEvent(QPaintEvent *) { QPainter paint(this); paint.drawLine(QPointF(0, 0), QPointF(100, 100)); } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyQDialog w; w.setWindowTitle("QDialog"); w.show(); //该窗口和QWidget窗口的不同之处在于不能调节窗口的大小,且大小标签变成了?标签 app.exec(); }
MainWindow窗口适用于添加选项框等界面。
头文件MyMianWidonw.h, 继承与MainWindow
#ifndef MYMAINWINDOW_H #define MYMAINWINDOW_H #include <QMainWindow> //为了让系统告诉你剩下可操作的空间在哪里? #include "MyView.h" #include<QSystemTrayIcon> //系统托盘图标 //QMainWindow继承自QWidget class MyMainWindow : public QMainWindow { Q_OBJECT public: explicit MyMainWindow(QWidget *parent = 0); MyView *_view; QMenu *_menu; QSystemTrayIcon *_icon; //托盘 void mousePressEvent(QMouseEvent *); signals: public slots: void slotOpen(); void slotActivated(QSystemTrayIcon::ActivationReason); }; #endif // MYMAINWINDOW_H
#ifndef MYVIEW_H #define MYVIEW_H #include <QWidget> class MyView : public QWidget { Q_OBJECT public: explicit MyView(QWidget *parent = 0); void paintEvent(QPaintEvent *); signals: public slots: }; #endif // MYVIEW_H
#include "MyMainWindow.h" #include<QApplication> #include<QMenu> //菜单类 #include<QMenuBar> //菜单栏, MainWindow里边独有的 #include<QAction> //每一个菜单项,快捷键也可以用 #include<QFileDialog> #include<QFileInfo> #include<qDebug> #include<QToolBar> //增加工具栏按钮 #include<QStatusBar> //状态栏 #include<QLabel> #include<QMouseEvent> #include<QCursor> //调整鼠标的位置为窗口的相对位置 MyMainWindow::MyMainWindow(QWidget *parent) : QMainWindow(parent) { //加菜单 QMenuBar *pMenuBar = menuBar(); QMenu *pmenu = pMenuBar->addMenu("File"); //增加一个File菜单 _menu = pmenu; //为File菜单增加一个选项,名字open,添加到this窗口,调用一个槽函数,快捷键为Ctrl+O(window系统下) QAction *openAction = pmenu->addAction("&Open", this,SLOT(slotOpen()), QKeySequence::Open); pmenu->addSeparator(); //增加一条线 QAction *closeAction = pmenu->addAction("&close", this, SLOT(close()), QKeySequence::Close); //设置消息提示 closeAction->setToolTip("close window"); //增加工具栏,工具栏和菜单栏实质差不多,只不过其表现方式有些不同,而且toolBar是可以浮动的 QToolBar *toolBar = this->addToolBar("My Tool Bar..."); toolBar->addAction(openAction); toolBar->addAction(closeAction); //status bar, 状态栏,显示在窗口的最下方 QStatusBar *pstatusBar = this->statusBar(); pstatusBar->addWidget(new QLabel("<font color= red size = 16 style=font-style:italic style=font-weight:bold>Apple Lin</font>")); //别的空间占用了之后,剩下的区域都是centralWidget,也就是说,窗口中可操作的区间在MyView里边即可,别忘了this,将该view添加到该窗口中 _view = new MyView; this->setCentralWidget(_view); //托盘,相当于在打开该应用程序的时候再桌面上有一个图标 _icon = new QSystemTrayIcon; _icon->setIcon((QIcon("../icon.ico"))); _icon->setToolTip("This is icon test"); _icon->show(); //将鼠标知道图标的位置会提示消息 _icon->setContextMenu(_menu); //触发图标按钮 connect(_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(slotActivated(QSystemTrayIcon::ActivationReason))); } void MyMainWindow::slotActivated(QSystemTrayIcon::ActivationReason reason) { if(reason == QSystemTrayIcon::Trigger) { if(this->isHidden()) this->show(); else this->hide(); } } void MyMainWindow::mousePressEvent(QMouseEvent *ev) { //此时鼠标跳出的位置是相对于电脑桌面的位置,而不是现对于窗口的位置 // _menu->exec(ev->pos()); if(ev->button() == Qt::RightButton) _menu->exec(QCursor::pos()); } void MyMainWindow::slotOpen() { QString _dirFile; QString filename = QFileDialog::getOpenFileName(this, "Open", _dirFile, "File (*.doc *.pdf)"); if(filename != "") qDebug()<<filename; QFileInfo fileinfo(filename); _dirFile = fileinfo.filePath(); } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyMainWindow w; w.setWindowTitle("MyMainWindow"); w.show(); app.exec(); }
#include "MyView.h" #include<QPixmap> #include<QPainter> MyView::MyView(QWidget *parent) : QWidget(parent) { } void MyView::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawPixmap(QPoint(0, 0), QPixmap("../pic.jpg")); }
而且在左面上点击右键,还会有选项框出来。