QT学习笔记

一,三种窗口
1,QWidget类是所有用户界面对象的基类。               窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
2,QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态条变得更容易,当用户点击菜单项或者工具条按钮时,槽会被调用。
3,QDialog 是最普通的顶级窗口。一个不会被嵌入到父窗口部件的窗口部件叫做顶级窗口部件。通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口
4,补充:如果是主窗体,就选择QMainWindow,如果是顶级对话框,就选择QDialog,如果不确定,或者前两种情况都有,那么,就选择QWidget。
二,QT setwindowflags的属性总结
setwindowflags用于设置窗口的属性与样式
setWindowFlags(Qt::CustomizeWindowHint);//设置窗口标题栏自定义
setWindowFlags(Qt::WindowMinimizeButtonHint);//设置窗口的标题栏只有最小化的按钮
setWindowFlags( Qt::WindowCloseButtonHint );//设置窗口的标题栏只有关闭的按钮
setWindowFlags(Qt::WindowStaysOnTopHint);//设置窗体一直置顶,并且不会抢焦点
setWindowFlags(this->windowFlags());//设置窗口为QT的默认属性
setWindowFlags(Qt::FramelessWindowHint));//设置窗体无边框,不可拖动拖拽拉伸
setWindowModality(Qt::WindowModal); //设置窗体为模态
三,常见的鼠标键盘事件以及QEvent
1,鼠标事件
mousePressEvent//鼠标点击按下触发
例程
void MainWindow::mousePressEvent(QMouseEvent * e)
{
    if(e->button() == Qt::LeftButton)
    {
        //左键触发
    }
    if (event->button() == Qt::MidButton)
    {
        //中键触发
    }
    else if(e->button() == Qt::RightButton)
    {
        //右键触发
    }
}
mouseMoveEvent//鼠标移动触发
例程
void MainWindow::mouseMoveEvent(QMouseEvent * e)
{
}
mouseReleaseEvent//鼠标点击释放触发
void MainWindow::mouseReleaseEvent(QMouseEvent * e)
{
}
mouseDoubleClickEvent//双击触发
wheelEvent//滚轮触发
例程void MainWindow::wheelEvent(QWheelEvent *event)
{
    if(event->delta()>0)
    {
        //上滚
    }
    else
    {
        //下滚
    }
}
2,键盘事件
keyPressEvent(QKeyEvent *event)//键盘按下触发
例程void MainWindow::keyPressEvent(QKeyEvent * event)
{
    //获取键值
    switch (event->key())
    {
    case Qt::Key_Escape:
        qDebug() <<"ESC";
        break;
    case Qt::Key_F1:
        qDebug() <<"F1";
        break;
    case Qt::Key_F2:
        qDebug() <<"F2";
        break;
    case Qt::Key_5:
        qDebug() <<"5";
        break;
    case Qt::Key_Back:
        qDebug() <<"Back";
        break;
    case Qt::Key_Enter:
        qDebug() <<"Enter";
        break;
    case Qt::Key_A:
        qDebug() <<"A";
        break;
    case Qt::Key_B:
        qDebug() <<"B";
        break;
    case Qt::Key_C:
        qDebug() <<"C";
        break;
    default:
        qDebug() << event->key();
        break;
    }
}
3,QEvent
QEvent 类是所有事件类的基类,事件对象包含事件参数
Qt 的主事件循环(QCoreApplication::exec())从事件队列中获取本地窗口系统事件,将它们转化为 QEvents,然后将转换后的事件发送给 QObjects。

一般来说,事件来自底层窗口系统(spontaneous() 返回 true),但也可以使用 QCoreApplication::sendEvent() 和 QCoreApplication::postEvent()(spontaneous() 返回 false)来手动发送事件。

QObjects 通过调用它们的 QObject::event() 函数接收事件。该函数可以在子类中重新实现,来处理自定义的事件以及添加额外的事件类型,QWidget::event() 就是一个很著名的例子。默认情况下,像 QObject::timerEvent() 和 QWidget::mouseMoveEvent() 这样的事件可以被发送给事件处理函数。QObject::installEventFilter() 允许一个对象拦截发往另一个对象的事件。

基本的 QEvent 只包含了一个事件类型参数。QEvent 的子类包含了额外的描述特定事件的参数。
下面只介绍两个,感兴趣的可以详细了解一下
enterEvent(QEvent*)//鼠标进入窗口边界触发
leaveEvent(QEvent*)//鼠标离开窗口触发
四,坐标
1、QMouseEvent中的坐标
QMouseEvent中保存了两个坐标,一个是全局坐标,当然另外一个是局部坐标。
全局坐标(globalPos())即是桌面屏幕坐标(screen coordinates),这个跟windows下的调用getCursorPos函数得到的结果一致。
局部坐标(pos())即是相对当前active widget的坐标,左上角坐标为(0,0)

补充一个公式:
this->mapFromGlobal(this->cursor().pos()) = event.pos()

2、鼠标跟踪
在qt中,鼠标跟踪对应函数mouseMoveEvent。但是,默认情况下他并不能如期象你想象的那样响应鼠标的移动。此时,你只需在合适的位置调用一下函数setMouseTracking(true)即可。
If mouse tracking is switched off, mouse move events only occur if a mouse button is pressed while the mouse is being moved.
If mouse tracking is switched on, mouse move events occur even if no mouse button is pressed.
默认情况下,mouseMoveEvent响应你按下鼠标的某个键(拖动,但不局限于左键拖动)的鼠标移动。
五,QT动画效果实现
动画框架由基类QAbstractAnimation和它的两个儿子QVariantAnimation和QAnimationGroup组成。QAbstractAnimation是所有动画类的祖宗。它包含了所有动画的基本属性。比如开始,停止和暂停一个动画的能力。它也可以接收时间改变通知。
动画框架又进一步提供了QProertyAnimation类。它继承自QVariantAnimation并对某个Qt属性(它须是Qt的”元数据对象系统”的一部分,见
复杂的动画可以通过建立一个QAbstractAnimation的树来构建。这个树通过使用QAnimationGroups来创建,QAnimationGroups作为其它动画的容器。注意动画组也是从QAbstractAnimation派生的,所以动画组可以再包含其它动画组。
动画框架可以单独使用,同时也被设计为状态机框架的一部分。状态机提供了一个特定的状态可以用来播放动画。在进入或退出某个状态时QState也可以设置属性们,并且这个特定的动画状态将在指定QPropertyAnimation时给予的值之间做插值运算。
在场景的背后,动画被一个全局定时器收集,这个定时器发送update到所有的正在播放的动画中。
QPropertyAnimation 动画Qt属性的类 
我们选择动画Qt属性的一个主要理由是Qt属性为我们提供了自己动画已存在的类的自由度。尤其是QWidget类
下面为桌面精灵里的一段代码
void evle::mouseReleaseEvent(QMouseEvent* event)     //松开鼠标后自动贴边隐藏并且透明
{
    QPropertyAnimation* pAnimation = new QPropertyAnimation(this, "geometry");
    QDesktopWidget* pDesktopWidget = QApplication::desktop();//获得桌面
    //窗口的宽和高
    int tx = width();
    int ty = height();
    //获得屏幕宽度
    int lx = pDesktopWidget->availableGeometry().width();
    int ly = pDesktopWidget->availableGeometry().height();
    if (this->x() < 2 * tx)
    {
        pAnimation->setDuration(100);
        pAnimation->setStartValue(QRect(this->x(), this->y(), width(), height()));   //起始位置
        pAnimation->setEndValue(QRect(-50, this->y(), width(), height()));       //终点位置
        pAnimation->start(QAbstractAnimation::DeleteWhenStopped);
        QPixmap pixw = QPixmap("Resources/4.png");
        label->setPixmap(pixw);
        //设置窗口透明度
        //this->setWindowOpacity(0.3);
    }
}
六,QPixmap类
1,介绍
QPixmap类用于绘图设备的图像显示,它可以作为一个QPaintDevice对象,也可以加载到一个控件中,通常是标签或按钮,用于在标签或按钮上显示图像。
QPixmap可以读取的图像文件类型有BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM等。
在上一节中桌面精灵的代码中用到了该类来显示图片,可以看一下。
2,常见方法
copy()    从QRect对象复制到QPixmap对象
fromImage()    将QImage对象转换为QPixmap对象
grabWIdget()    从给定的窗口小控件创建一个像素图
grabWindow()    在窗口中创建数据的像素图
load()    加载图像文件作为QPixmap对象
save()    将QPixmap对象保存为文件
toImage()    将QPixmap对象转换为QImage对象
七,QAction类
1,介绍
QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中。
应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面,

这个时候使用action来表示这些命令就显得十分有用。
Actions可以被添加到菜单和工具栏中,并且可以自动保持在菜单和工具栏中的同步。例如,在一个字处理软件中,如果用户在工具栏中按下了Bold按钮,那么菜单中的Bold选项就会自动被选中。
Actions可以作为独立的对象被创建,但是我们也可以在构建菜单的时候创建它们;QMenu类包含了非常简便的方法用于创建适合用作菜单项的actions。
QAction可以包括一个图标,菜单文本,快捷键,状态文本,"What`s This"文本以及一个tooltip。这些内容的绝大部分都可以在构造函数中设置。也可以通过setIcon(),setIconText(),setShortCut(),setStatusTip(),setWhatsThis和SetToolTip()函数分别设置。对于菜单项,我们还可以通过setFont()单独为它们设置font。
可以通过QWidget::addAction()或者是QGraphicsWidget::addAction()函数将Actions添加到窗口部件上。注意,只有将Actions添加到窗口部件上之后,我们才可以使用这些actions;当actions的快捷键是全局的时候,我们也必须先将actions添加到窗口部件上。
一旦QAction被创建了,那么就必须将它添加到相关的菜单和工具栏上,然后将它们链接到实现相应action功能的槽函数上。
例如:
openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this);
openAct->setShortcuts(QKeySequence::Open);
openAct->setStatusTip(tr("Open an existing file"));
connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
fileMenu->addAction(openAct);
fileToolBar->addAction(openAct);
八,QTimer类
QTimer作为Qt中方便快捷的定时器,在日常使用中经常用到。
QTimer类提供重复和单次定时器。
QTimer类为定时器提供高级编程接口。 创建一个QTimer实例,将其timeout()信号连接到相应的槽,然后调用start(),之后,它将以固定间隔发出timeout()信号。
举个例子,一个1秒(1000毫秒)触发的定时器(来自模拟时钟示例):
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
计时开始之后,槽函数update()将会每秒触发一次。

你可以通过调用setSingleShot(true)将计时器设置为仅触发一次。 你还可以使用静态函数QTimer::singleShot()在指定的时间间隔后调用槽函数:
QTimer::singleShot(200, this, SLOT(updateCaption()));
九,QMessageBox消息对话框
1,消息对话框的两种通途:
①用于简单的信息提示,并无其他所用,不利用对话框的返回值
②用于确认选择对话框,对对话框的返回值进行利用
由warning()、information()、critical()、about()这几个函数组成,这几个函数的参数与使用方法都是相同的,只是图标显示不一样而已,下面以warning()函数为例。
2,函数
原型一
int QMessageBox::warning(
QWidget *parent, const QString &title, const QString &text, 
int button0, int button1, int button2 = 0
)
parent参数:父窗口
title参数:消息对话框标题
text参数:消息对话框的内容
button0、button1、button2参数:按钮的退出类型,可选择以下的类型(从左至右都可以缺省,如果都缺省,则默认为QMessageBox::Ok)
原型二
int QMessageBox::warning(QWidget *parent, const QString &title, const QString &text, 
const QString &button0Text, const QString &button1Text = QString(), const QString &button2Text = QString(), 
int defaultButtonNumber = 0, int escapeButtonNumber = -1)
parent、title、text参数:与上面的相同
button0Text、button1Text、button2Text参数:为退出的选择按钮,可以自定义按钮文本(不过都可以缺省,都缺省之后为QMessageBox::Ok)。如果都设置了button的序号为0、1、2
defaultButtonNumber参数:为消息对话框显示之后,光标默认停留在前面那个button上面(可以选择为前面的button序号,如果缺省默认为0)
返回值:为你选择的退出按钮类型的值(就是button的序号)
例程
QMessageBox::warning(NULL, "warning", "camera openning error",
                QMessageBox::Yes);
十,信号与槽
1,介绍
信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。信号和槽是 QT 自行定义的一种通信机制,它独立于标准的 C/C++ 语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C++ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码。

在我们所熟知的很多 GUI 工具包中,窗口小部件 (widget) 都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在 QT 中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。 信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生 core dumps。

所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射 (emit) 出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。

你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。
2,connect函数
connect,是QT中的连接函数,将信号发送者sender对象中的信号signal与接受者receiver中的member槽函数联系起来。当指定信号signal时必须使用宏SIGNAL(),当指定槽函数时必须使用宏SLOT(),如果发送者与连接者属于同一个对象时,那么在connect调用中接受者参数可以忽略。

通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:
bool QObject::connect ( const QObject * sender, const char * signal, 
         const QObject * receiver, const char * member ) [static]

例程
class MyWidget : public QWidget 
    { 
    public: 
        MyWidget(); 
    ... 
    signals: 
        void aSignal(); 
    ... 
    private: 
    ... 
        QPushButton *aButton; 
    }; 
    MyWidget::MyWidget() 
    { 
        aButton = new QPushButton( this ); 
        connect( aButton, SIGNAL(clicked()), SIGNAL(aSignal()) ); 
    }

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若水菱花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值