QT Day2

一、QT Creator 设计器

QT Day2

二、常见控件

1、QLabel控件

功能

  1. 显示文字(普通文本,html)
  2. 显示图片
  3. 显示动画(gif)

功能详解

1、显示文字

void setText(const QString &)//设置文字的成员函数

/*用法实例*/
QLabel *label=new QLabel;
label->setText("Hello World!");     //普通文本显示
label->setText("<h1>Hello World!</h1>");   //html文本显示

特殊功能:
可以用于打开在线连接

QLabel * label = new QLabel(this);
label ->setText("Hello, World");
label ->setText("<h1><a href=\"https://www.baidu.com\">
百度一下</a></h1>");
/*利用setOpenExternalLinks打开链接*/ 
label->setOpenExternalLinks(true);
/*使用信号和槽打开链接*/
connect(label, &QLabel::linkActivated, this,&MyWidget::slotOpenUrl);

//槽函数    
void MyWidget::slotOpenUrl(const QString &link)
{
    QDesktopServices::openUrl(QUrl(link));
}

2、显示图片

/*成员函数*/
void setPixmap(const QPixmap&);
QPixMap pixmap;
pixmap.load("路径");
QLabel *label =new QLabel;
label.setPixmap(pixmap);   //也可以直接使用QPixmap构造函数设定

3、显示动画

/*成员函数*/
void setMovie(QMovie *movie)
QMovie *movie = new QMovie("路径");
movie ->start();
QLabel *label= new QLabel;
label->setMovie(movie);

2、QLineEdit

功能:Qt提供的单行文本编辑框(用于密码输入等功能)

/*成员函数*/
void setText(const QString &)

/*设置显示模式*/
void setEchoMode(EchoMode mode)

/*设置宽度*/
void setTextMargins(int left,int top,int right,int bottom)

三、布局

QT Day2

四、自定义控件

使用方式:通过写好类,在设计界面进行提升

五、常见事件处理

1、事件

事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
在前面我们也曾经简单提到,Qt 程序需要在main()函数创建一个QApplication对象,然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler),关于这一点,会在后边详细说明。
在所有组件的父类QWidget中,定义了很多事件处理的回调函数,如:

  • KeyPressEvent()
  • keyReleaseEvent()等

PS:这些函数都是虚函数,需要在子类中重新实现
事件使用例子:

/*定义EventLabel对事件进行改写*/
class EventLabel : public QLabel
{
protected:
    /*对应的事件*/
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
};
 
void EventLabel::mouseMoveEvent(QMouseEvent *event)
{
this->setText(QString("<center><h1>Move: (%1, %2)
</h1></center>").arg(QString::number(event->x()),
            QString::number(event->y())));
}
 
void EventLabel::mousePressEvent(QMouseEvent *event)
{
    this->setText(QString("<center><h1>Press:(%1, %2)
</h1></center>").arg(QString::number(event->x()),
                QString::number(event->y())));
}
 
void EventLabel::mouseReleaseEvent(QMouseEvent *event)
{
    QString msg;
    msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>",
                event->x(), event->y());
    this->setText(msg);
}
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    EventLabel *label = new EventLabel;
    label->setWindowTitle("MouseEvent Demo");
    label->resize(300, 200);
    label->show();
 
    return a.exec();
}

2、event()

作用:event()函数主要用于分发
例如:

bool CustomWidget::event(QEvent *e)
{
    if (e->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);//强制类型转换
        if (keyEvent->key() == Qt::Key_Tab) {
            qDebug() << "You press tab.";
            return true;
        }
    }
    return QWidget::event(e);//必要的,重新处理其他事件
}

3、事件过滤器

QT Day2

/*函数原型*/
virtual bool QObject::eventFilter(QObject *watched,QEvent *event);

/*简单实例*/
class MainWindow : public QMainWindow
 {
 public:
     MainWindow();
 protected:
     bool eventFilter(QObject *obj, QEvent *event);
 private:
     QTextEdit *textEdit;
 };
 
 MainWindow::MainWindow()
 {
     textEdit = new QTextEdit;
     setCentralWidget(textEdit);
 
     textEdit->installEventFilter(this);
 }
 
 bool MainWindow::eventFilter(QObject *obj, QEvent *event)
 {
     if (obj == textEdit) {
         if (event->type() == QEvent::KeyPress) {
             QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
             qDebug() << "Ate key press" << keyEvent->key();
             return true;
         } else {
             return false;//
         }
     } else {
         // pass the event on to the parent class
         return QMainWindow::eventFilter(obj, event);
     }
 }

赞 (0)

评论区

发表评论

44+37=?

暂无评论,要不来一发?

回到顶部