Qt窗口类学习——QWidget

QWidget 类代表一般的窗口,其他窗口类都是从 QWidget 类继承出来的。而 QWidget 类则同时继承了 QObject 类 和 QPaintDevice 类,也就是说,窗口类都是 Qt 对象类。这里的 QPaintDevice 类则是所有可绘制的对象的基类。

构造函数

QWidget(QWidget *parent = 0, Qt::WindowFlags f = 0);

其中参数 parent 指向父窗口,如果这个参数为 0,则窗口就成为一个顶级窗口
参数 f 是构造窗口的标志,主要用于控制窗口的类型和外观等,有以下常用值。

1)Qt::FramelessWindowHint:没有边框的窗口。

2)Qt::WindowStaysOnTopHint:总是最上面的窗口。

3)Qt::CustomizeWindowHint:自定义窗口标题栏,以下标志必须与这个标志一起使用才有效,否则窗口将有默认的标题栏。

4)Qt::WindowTitleHint:显示窗口标题栏。

5)Qt::WindowSystemMenuHint:显示系统菜单。

6)Qt::WindowMinimizeButtonHint:显示最小化按钮。

7)Qt::WindowMaximizeButtonHint:显示最大化按钮。

8)Qt::WindowMinMaxbuttonHint:显示最小化按钮和最大化按钮。

9)Qt::WindowCloseButtonHint:显示关闭按钮。

独立窗口

窗口构造的时候如果有 Qt::Window 标志,那么它就是一个独立窗口,否则就是一个依附于其他独立窗口的窗口部件。顶级窗口一定是独立窗口,但独立窗口不一定是顶级的,它可以有父窗口,当父窗口被析构时它也会随之被析构。独立窗口一般有自己的外边框和标题栏,可以有移动、改变大小等操作。

一个窗口是否为独立窗口可用下面的成员函数来判断:

bool isWindow() const;     // 判断是否为独立窗口

下面这个函数可以得到窗口部件所在的独立窗口。当然,如果窗口本身就是独立窗口,那么得到的就是自己。

QWidget *window() const;      // 所得所在的独立窗口

而下面这个函数可以得到窗口的父窗口:

QWidget *parentWidget() const;    // 得到父窗口

窗口标题

WindowTitle 属性表示窗口的标题,与之相关的成员函数如下:

QString windowTitle() const;    // 获得窗口标题
void setWindowTitle(const QString &text);    // 设置窗口标题为 text

几何参数

这里的几何参数指的是窗口的大小和位置。一个窗口有两套几何参数,一套是窗口外边框所占的矩形区域,另一套是窗口客户区所占的矩形区域。所谓窗口客户区就是窗口中去除边框和标题栏用来显示内容的区域。

这两套几何参数分别由两个 QRect 型的属性代表,相关的成员函数如下:

const QRect &geometry() const;                 // 获取客户区几何参数
void setGeometry(int x, int y, int w, int h);    // 设置客户取几何参数
void setGeometry(const QRect &rect);         // 设置客户区几何参数
QRect frameGeometry() const;                  // 获取外边框几何参数

这里虽然没有直接设置外边框几何参数的函数,但客户区几何参数变化之后,外边框的几何参数也会随之变化。设置几何参数可能会使窗口的位置及大小发生变化,这时会发送窗口移动事件 QMoveEvent,如果大小有变化,还会发送窗口改变大小事件 QResizeEvent,事件的处理函数分别是 moveEvent 和 resizeEvent。注意这里的坐标都是相对于父窗口的,因此移动一个窗口并不导致它的所有部件都接收到移动事件。
注意:不要在 moveEvent 或 resizeEvent 两个事件处理函数中设置几何参数,否则将导致无限循环。

窗口的几何参数也可以由用户的操作改变,这时也会发送相应的事件。

为了方便使用,与几何参数相关的成员函数还有以下这些:

QPoint pos() const;     // 获得窗口左上角的坐标(外边框几何参数)
QSize size() const;      // 窗口大小 (客户区几何参数)
int x() const;                  // 窗口左上角横坐标 (外边框几何参数)
int y() const;                  // 窗口左上角纵坐标 (外边框几何参数)
int height() const;        // 窗口高度 (客户区几何参数)
int width() const;          // 窗口宽度 (客户区几何参数)

可以看出,坐标全部是外边框几何参数,而大小全部是客户区几何参数。要获得外边框的大小需要用下面这个成员函数:

QSize frameSize() const;    // 窗口大小 (外边框几何参数)

改变这些属性可以用下面这些成员函数:

void move(int x, int y);    // 将窗口左上角移动到坐标(x,  y)处;
void move(const QPoint &pos);     // 将窗口左上角移动到 pos 处;
void resize(int w, int h);     // 将窗口的宽度改为 w, 高度改为 h
void resize(const QSize &size);     // 将窗口的大小改为  size

可见性与隐藏

可见性指的是窗口是否显示在屏幕上的属性。被其他窗口暂时遮挡住的窗口也属于可见的。可见性由窗口的 visible 属性表示,与之相关的成员函数如下:

bool isVisible() const;    // 判断窗口是否可见
bool isHidden() const;   // 判断窗口是否隐藏
virtual void setVisible(bool visible);   // 设置窗口是否隐藏
void setHidden(bool hidden);    // 等价于 setvisible(!hidedn);
1)隐藏的窗口一定是不可见的。

2)非隐藏的窗口在它的父窗口可见的情况下也是可见的。

3)非隐藏的顶级窗口是可见的。
void show();     // 显示窗口,等价于 setVisible(true);
void hide();       // 隐藏窗口,等价于 setHidden(true);

窗口状态

独立窗口有正常、全屏、最大化、最小化几种状态,与之相关的成员函数如下:

bool isMinimized() const;     // 判断窗口是否为最小化
bool isMaximized() const;    // 判断窗口是否为最大化
bool isFullScreen() const;   // 判断窗口是否为全屏
void showMinimized();         // 以最小化方式显示窗口,这是一个槽
void showMaximized();        // 以最大化方式显示窗口,这是一个槽
void showFullScreen();        // 以全屏方式显示窗口,这是一个槽
void showNormal();              // 以正常方式显示窗口,这是一个槽

全屏方式与最大化的区别在于:全屏方式下窗口的边框和标题栏消失,客户区占据整个屏幕。窗口的各种状态仅对独立窗口有效,对窗口部件来说没有意义。

Qt::WindowStates windowState() const;                         // 获取窗口状态
void setWindowState(Qt::WindowStates windowState);      // 设置窗口状态

Qt::WindowStates 类型有以下几个取值。

        1)Qt::WindowNoState:无标志,正常状态。

        2)Qt::WindowMinimized:最小化状态。

        3)Qt::WindowMaxmized:最大化状态。

        4)Qt::WindowFullScreen:全屏状态。

        5)Qt::WindowActive:激活状态。
        
        备注:这里取值可以用 “按位或” 的方式组合起来使用。

使能

处于使能状态的窗口才能处理键盘和鼠标等输入事件,反之,处于禁用状态的窗口不能处理这些事件。窗口是否处于使能状态由属性 enabled 表示,相关成员函数如下:

bool isEnabled() const;     // 获得窗口的使能装态
void setEnabled(bool enable);  // 设置窗口的使能状态,这是一个槽
void setDisabled(bool disabled);     // 等价于 setEnabled(!disable),这是一个槽

焦点

焦点用来控制同一个独立窗口内哪一个部件可以接受键盘事件,同一时刻只能有一个部件获得焦点。与焦点有关的成员函数如下:

bool hasFocus() const;                     // 判断窗口是否获得焦点
void setFocus();                             // 使窗口获得焦点,这是一个槽
void clearFocus();                          // 使窗口失去焦点
QWidget *focusWidget() const;        // 得到窗口内获得焦点的子窗口 

值得一提的是 editFocus 属性,这是一个专门用于嵌入式系统的属性。因为嵌入式系统通常键盘较小,没有专门用于切换焦点的 Tab 键,所以上下方向键被用来切换焦点。如果一个窗口部件设置 editFocus 属性为 true,则上下方向键就不再用于切换焦点,而是发送给这个窗口。与这个属性相关的成员函数如下:

bool hasEditfocus() const;     // 判断窗口是否有 editFocus 属性
void QWidget::setEditFocus(bool enable);     // 设置窗口的 editFocus 属性

布局

属性 layout 代表窗口的顶级布局,相关的成员函数如下:

QLayout *layout() const;                   // 获得顶级布局
void setLayout(QLayout *layout);        // 设置顶级布局

字体

font 属性表示所用的字体,相关的成员函数如下:

const QFont &font() const;         // 获得字体
void setFont(const QFont &);    // 设置字体

常用槽

bool close();	//关闭窗口
void lower();         // 降低窗口到最下面
void raise();        // 提升窗口到最上面

事件

QWidget 类能够处理类型丰富的事件,这里将介绍一些常用的事件处理函数。

窗口事件

virtual void closeEvent(QCloseEvent *event);    // 关闭
virtual void showEvent(QShowEvent *event);    //  显示
virtual void hideEvent(QHideEvent *event);        // 隐藏
virtual void moveEvent(QMoveEvent *evnet);     // 移动
virtual void resizeEvent(QResizeEvent *event);  // 改变大小

通过 QMoveEvent 类的以下成员函数可以获得窗口的旧坐标和新坐标:

const QPoint &oldPos() const;     // 旧坐标
const QPoint &newPos() constl   // 新坐标

通过 QResizeEvent 类的以下成员函数可以获得窗口的旧大小和新大小:

const QSize &oldSize() const;     // 旧大小
const QSize &newSize() const;   // 新大小

键盘事件

virtual void keyPressEvent(QKeyEvent *event);   // 键按下
virtual void keyReleaseEvent(QKeyEvent *event);  // 键松开

通过 QKeyEvent 类的成员函数可以获得关于按键的一些信息,如:

int key() const;     // 得到键值

鼠标事件

virtual void mousePressEvent(QMouseEvent *event);   	 // 鼠标键按下
virtual void mouseReleaseEvent(QMouseEvent *event);           // 鼠标键松开
virtual void mouseDoubleCllckEvent(QMouseEvent *event); // 鼠标键双击
virtual void mouseMoveEvent(QMouseEvent *event);          // 鼠标移动
virtual void enterEvent(QEvent *event);                        // 鼠标进入窗口
virtual void leaveEvent(QEvent *event);                      // 鼠标离开窗口
virtual void wheelEvent(QWheelEvent *event);              // 鼠标滚轮移动

通过 QMouseEvent 事件的成员函数可获得关于鼠标的信息,如:

const QPoint &pos() const;              // 得到鼠标坐标(相对于接收事件的窗口)
int x()  const;                                    // 得到鼠标横坐标(相对于接收事件的窗口)
int y() const;                                  // 得到鼠标纵坐标(相对于接收事件的窗口)
const QPoint &globalPos() const;   // 得到鼠标坐标(全局坐标)
int globalX() const;                     // 得到鼠标横坐标 (全局坐标)
int globalY() const;                        // 得到鼠标纵坐标 (全局坐标)
Qt::MouseButton button() const;        // 得到引起事件的鼠标键
Qt::MouseButtons buttons() const;         // 得到事件发生时的鼠标键状态 

其中,Qt::MouseButton 是一个枚举类型,有以下常用取值。

         1)Qt::NoButton:无键。

         2)Qt::LeftButton:左键。

         3)Qt::RightButton:右键。

         4)Qt::MidButton:中键。

滚轮事件

QWheelEvent 类代表滚轮事件,它有一套与 QMountEvent 类几乎相同的成员函数,但少一个 button 函数,多以下两个函数:

int delta() const;    // 获得滚轮转动的角度
Qt::Orientation orientationI() const;    // 获得滚轮转动的方向

Qt::Orientation 是一个枚举类型,它有以下取值。
1)Qt::Horizontal:横向。
2)Qt::Vertical:纵向。

焦点事件

virtual void focusInEvent(QFocusEvent *event);    // 获得焦点
virtual void focusOutEvent(QFocusEvent *event);  // 时取焦点

如果要接受或拒绝和一个事件要调用 QEvent 类的成员函数,如:

event->accept();    // 接受事件
event->ignore();    // 拒绝事件
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT5串口编程可以用于编写简单的上位机,通过串口与下位机进行通信。下面是一个简单的上位机编写示例: 首先,要在QT项目中加入串口模块,可以通过在.pro文件中加入以下代码实现: ``` QT += serialport ``` 接下来,创建一个新的,命名为SerialPort,继承自QObject,并添加以下代码: ```cpp #include "serialport.h" SerialPort::SerialPort(QObject *parent) : QObject(parent) { serial = new QSerialPort(this); connect(serial, &QSerialPort::readyRead, this, &SerialPort::readData); } void SerialPort::openPort(QString portName, qint32 baudRate) { serial->setPortName(portName); serial->setBaudRate(baudRate); if(serial->open(QIODevice::ReadWrite)) { qDebug() << "Serial port is open"; } else { qDebug() << "Serial port failed to open"; } } void SerialPort::closePort() { if(serial->isOpen()) { serial->close(); qDebug() << "Serial port is closed"; } } void SerialPort::readData() { QByteArray data = serial->readAll(); qDebug() << "Received data: " << data; // 在这里可以对接收到的数据进行处理 } void SerialPort::writeData(QByteArray data) { if(serial->isOpen()) { serial->write(data); qDebug() << "Sent data: " << data; } else { qDebug() << "Serial port is not open"; } } ``` 在主窗口中,可以使用SerialPort的实例来控制串口的打开、关闭和数据的读写,可以通过按钮来触发相应的操作。下面是一个简单的主窗口实现: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new SerialPort(this); connect(ui->openButton, &QPushButton::clicked, this, &MainWindow::openPort); connect(ui->closeButton, &QPushButton::clicked, this, &MainWindow::closePort); connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::sendData); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openPort() { QString portName = ui->portComboBox->currentText(); qint32 baudRate = ui->baudRateComboBox->currentText().toInt(); serialPort->openPort(portName, baudRate); } void MainWindow::closePort() { serialPort->closePort(); } void MainWindow::sendData() { QString data = ui->sendLineEdit->text(); serialPort->writeData(data.toUtf8()); ui->sendLineEdit->clear(); } ``` 在QT设计器中,可以创建一个MainWindow窗口,包含一个QComboBox用于选择串口号,一个QComboBox用于选择波特率,一个QLineEdit用于输入发送的数据,以及几个QPushButton用于触发相应的操作。 以上就是一个简单的QT5串口编程的上位机实现,你可以根据具体的需求进行进一步的修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值