QT/C++——主窗口和事件处理

一、主窗口

QT/C++——主窗口和事件处理_第1张图片

上面就是一个主窗口,主窗口中的每一个都是Action 

QT/C++——主窗口和事件处理_第2张图片

 QT/C++——主窗口和事件处理_第3张图片

这次新建工程要选择mainwindow

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 
#include 
#include 

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void openf()
    {
        QString filename = QFileDialog::getOpenFileName();
        te->setText(filename);
    }

    void copyf()
    {
        te->copy();
    }

    void pastf()
    {
        te->paste();
    }

    void setcf()
    {
        QColor ccc = QColorDialog::getColor();
        te->setTextColor(ccc);
    }
private:
    QAction *openfileact;

    QAction *copyfileact, *pastfileact;

    QAction *setcoloract;

    //central
    QTextEdit *te;

    //status
    QLabel *slb;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include 
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //create actions
    openfileact = new QAction(QIcon("open.png"), "open");
    openfileact->setShortcut(QKeySequence(tr("Ctrl+O")));

    copyfileact = new QAction(QIcon("copy.png"),"copy");
    pastfileact = new QAction(QIcon("past.png"),"past");

    setcoloract = new QAction(QIcon("color.png"),"setcolor");

    //create meu
    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(openfileact);

    QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));
    editMenu->addAction(copyfileact);
    editMenu->addAction(pastfileact);

    QMenu *setMenu = menuBar()->addMenu(tr("&Set"));
    setMenu->addAction(setcoloract);


    //create toolbars
    QToolBar *tfile = addToolBar("file");
    tfile->addAction(openfileact);
    QToolBar *tedit = addToolBar("edit");
    tedit->addAction(copyfileact);
    tedit->addAction(pastfileact);
    QToolBar *tset = addToolBar("set");
    tset->addAction(setcoloract);

    //cenctral
    te = new QTextEdit("hello");
    te->setMinimumSize(640, 480);
    setCentralWidget(te);

    //statures
    slb = new QLabel("1.txt*");
    QStatusBar *stb = statusBar();
    stb->addWidget(slb);

    connect(openfileact, SIGNAL(triggered(bool)), this, SLOT(openf()));
    connect(copyfileact, SIGNAL(triggered(bool)), this, SLOT(copyf()));
    connect(pastfileact, SIGNAL(triggered(bool)), this, SLOT(pastf()));
    connect(setcoloract, SIGNAL(triggered(bool)), this, SLOT(setcf()));

}

MainWindow::~MainWindow()
{

}

 运行后是这样的,

QT/C++——主窗口和事件处理_第4张图片

 QT/C++——主窗口和事件处理_第5张图片

还可以使用快捷方式并且有小图标。 

QT/C++——主窗口和事件处理_第6张图片

 QT/C++——主窗口和事件处理_第7张图片QT/C++——主窗口和事件处理_第8张图片

可以复制黏贴设置颜色,反正需要什么加什么就好了

二、事件

QT/C++——主窗口和事件处理_第9张图片

2.1事件处理 

QT/C++——主窗口和事件处理_第10张图片 QT/C++——主窗口和事件处理_第11张图片

定时器一秒输出一次

 QT/C++——主窗口和事件处理_第12张图片

鼠标点击记录位置

QT/C++——主窗口和事件处理_第13张图片

滑轮滚动输出正负,按键输出的是标号不是具体的按下了什么

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include //鼠标
#include //键盘
#include //滚轮


class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void mousePressEvent(QMouseEvent *event)
    {
        qDebug()<<"pressssss: "<pos();

    }

    void mouseMoveEvent(QMouseEvent *event)
    {
        qDebug()<<"moving!"<pos();
    }

    void keyPressEvent(QKeyEvent *event)
    {
        qDebug()<<"key: "<key();
    }

    void wheelEvent(QWheelEvent *event)
    {
        qDebug()<<"wheel: "<delta();
    }

    void timerEvent(QTimerEvent *event)
    {
        qDebug()<<"timer!";
    }
};

#endif // WIDGET_H

 

2.2绘图事件

QT/C++——主窗口和事件处理_第14张图片可以像一个表一样是可以动的

QT/C++——主窗口和事件处理_第15张图片

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void paintEvent(QPaintEvent *event)
    {
        qDebug()<<"ppppppp";

        QPainter p(this);

        p.translate(this->width()/2, this->height()/2);
        p.drawEllipse(QPoint(0, 0), 100, 100);
  //      p.drawLine(0, 0, 50, 50);
        p.rotate(i++*10);
        p.drawLine(0, 0, 50, 50);
    }

    void timerEvent(QTimerEvent *event)
    {
        update();
    }

private:
    int i;
};


#endif // WIDGET_H

2.3双缓冲绘图

QT/C++——主窗口和事件处理_第16张图片

QT/C++——主窗口和事件处理_第17张图片

 

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

    void mousePressEvent(QMouseEvent *event)
    {
        startp = event->pos();
    }

    void mouseReleaseEvent(QMouseEvent *event)
    {
        saveit = true;
        update();
    }

    void mouseMoveEvent(QMouseEvent *event)
    {
        endp = event->pos();
        update();
    }

    void paintEvent(QPaintEvent *event)
    {
        if(saveit)
        {
             QPainter px(pix);
             px.drawLine(startp, endp);
             saveit = false;
        }


        QPainter p(this);
        p.drawPixmap(0, 0, *pix);
        p.drawLine(startp, endp);
    }

private:
    QPoint startp;//起点
    QPoint endp;//终点
    QPixmap *pix;
    bool saveit;
};

#endif // WIDGET_H

双缓冲绘图其实就是把第一次的绘图用一个东西保存了一下再一起显示出来,保证之前的痕迹可以保留

2.4事件过滤器

 

QT/C++——主窗口和事件处理_第18张图片 

过滤器就是对事件进行过滤的一个类,他只要是Qobject类的派生类,并且他满足一个eventFilter

上图的y就是一个过滤器,y不要的x才处理。

下面用一个照片阅读器来演示一下什么是过滤器

QT/C++——主窗口和事件处理_第19张图片

没啥看的看截图吧

代码有点多还是放资源里。

你可能感兴趣的:(C++/QT,嵌入式,C++,qt)