一、QT Creator 设计器
二、常见控件
1、QLabel控件
功能
- 显示文字(普通文本,html)
- 显示图片
- 显示动画(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)
三、布局
四、自定义控件
使用方式:通过写好类,在设计界面进行提升
五、常见事件处理
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、事件过滤器
/*函数原型*/
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);
}
}