QT基础(六)----QDialog窗口 & MainWIndow窗口

一 QDialog窗口介绍

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窗口介绍

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

头文件MyView.h 继承与QWidget,用来编辑除菜单栏选项框之外的内容

#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


MyMainWindow.cpp

#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();
}

MyViwe.cpp

#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"));
}

运行结果:

而且在左面上点击右键,还会有选项框出来。



你可能感兴趣的:(QT基础(六)----QDialog窗口 & MainWIndow窗口)