Qt控件:显示控件
显示控件
- 1. QLabel
- 1.1 创建和基本设置
- 1.2 常用属性和方法
- 显示富文本和超链接
- 显示图像
- 1.3 示例
- 1.4 注意事项
- 2. QCalendarWidge
- 2.1 创建和基本设置
- 2.2 常用属性和方法
- 2.3 示例
- 2.4 注意事项
1. QLabel
在Qt中,QLabel 是用于显示文本或图像的控件,支持富文本、超链接、对齐方式等功能。
- 功能:显示静态文本、图像、HTML富文本等内容。
- 常用场景:界面标题、提示信息、图像展示等。
- 特点:默认不可交互,可通过设置使其支持超链接或接受点击事件。
1.1 创建和基本设置
方法1:在Qt Designer中添加
- 在Qt Designer的控件面板中找到 QLabel。
- 拖到界面上,在"属性编辑器"中设置
text
、alignment
、pixmap
等属性。
方法2:在代码中创建
#include <QLabel>// 在窗口构造函数中创建
QLabel *label = new QLabel("Hello, World!", this);
label->setAlignment(Qt::AlignCenter); // 文本居中对齐
label->setWordWrap(true); // 启用自动换行
1.2 常用属性和方法
文本操作
// 设置和获取文本
void setText(const QString &text);
QString text() const;// 设置文本格式(普通文本或HTML)
void setTextFormat(Qt::TextFormat format); // 如 Qt::RichText// 设置文本交互标志
void setTextInteractionFlags(Qt::TextInteractionFlags flags);
// 例如:Qt::TextSelectableByMouse(可选择文本)
图像操作
// 设置图像
void setPixmap(const QPixmap &pixmap);// 设置缩放策略
void setScaledContents(bool scaled); // 图像是否缩放以适应标签大小// 获取图像
const QPixmap *pixmap() const;
外观和行为
// 设置对齐方式
void setAlignment(Qt::Alignment alignment); // 如 Qt::AlignLeft | Qt::AlignVCenter// 设置自动换行
void setWordWrap(bool on);// 设置工具提示
void setToolTip(const QString &tip);// 设置打开外部链接
void setOpenExternalLinks(bool open); // 对HTML中的<a>标签有效
显示富文本和超链接
// 显示HTML富文本
label->setText("<h1>标题</h1><p>这是一段<strong>加粗</strong>的文本</p>");// 显示超链接(需设置setOpenExternalLinks(true))
label->setOpenExternalLinks(true);
label->setText("<a href=\"https://www.qt.io\">Qt官方网站</a>");// 自定义超链接点击事件(不设置setOpenExternalLinks时)
label->setTextInteractionFlags(Qt::TextBrowserInteraction);
connect(label, &QLabel::linkActivated, [=](const QString &link) {qDebug() << "点击链接:" << link;
});
显示图像
// 从文件加载图像
QPixmap pixmap(":/images/logo.png"); // 资源路径或文件路径
label->setPixmap(pixmap);// 调整图像大小以适应标签
label->setScaledContents(true);// 保持图像比例的同时适应标签
QPixmap scaledPixmap = pixmap.scaled(label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation
);
label->setPixmap(scaledPixmap);// 响应标签大小变化,动态调整图像
connect(label, &QLabel::resized, [=]() {QPixmap scaled = pixmap.scaled(label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);label->setPixmap(scaled);
});
1.3 示例
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QPixmap>class MyWidget : public QWidget {Q_OBJECT
public:MyWidget(QWidget *parent = nullptr) : QWidget(parent) {QVBoxLayout *layout = new QVBoxLayout(this);// 普通文本标签QLabel *textLabel = new QLabel("这是一个普通文本标签", this);textLabel->setAlignment(Qt::AlignCenter);// 富文本标签QLabel *richTextLabel = new QLabel(this);richTextLabel->setText("<h2>富文本示例</h2><p>支持<strong>粗体</strong>、<em>斜体</em>和""<a href=\"https://www.qt.io\">超链接</a></p>");richTextLabel->setOpenExternalLinks(true);richTextLabel->setAlignment(Qt::AlignCenter);// 图像标签QLabel *imageLabel = new QLabel(this);QPixmap pixmap(":/images/example.png"); // 替换为实际图像路径imageLabel->setPixmap(pixmap);imageLabel->setAlignment(Qt::AlignCenter);imageLabel->setScaledContents(true);// 添加到布局layout->addWidget(textLabel);layout->addWidget(richTextLabel);layout->addWidget(imageLabel);layout->addStretch();}
};
1.4 注意事项
- 性能考虑:频繁更新大量文本或高分辨率图像可能影响性能,可考虑使用
QLabel::setPixmap()
的缓存机制。 - 自动换行:
setWordWrap(true)
会使文本根据标签宽度自动换行,但可能影响布局计算。 - 交互性:若需要更复杂的交互(如拖放图像),可能需要继承
QLabel
并重写事件处理函数。
2. QCalendarWidge
在Qt中,QCalendarWidget 是一个用于日期选择的控件,提供月视图、年导航和日期范围限制等功能。
- 功能:提供可视化的日历界面,允许用户选择日期。
- 常用场景:日期选择器、日程安排、数据筛选等。
- 信号:日期变化、选中日期等事件会发出相应信号。
2.1 创建和基本设置
方法1:在Qt Designer中添加
- 在Qt Designer的控件面板中找到 QCalendarWidget。
- 拖到界面上,在"属性编辑器"中设置
selectedDate
、minimumDate
、maximumDate
等属性。
方法2:在代码中创建
#include <QCalendarWidget>
// 在窗口构造函数中创建
QCalendarWidget *calendar = new QCalendarWidget(this);
calendar->setSelectedDate(QDate::currentDate()); // 设置当前日期为选中日期
calendar->setGridVisible(true); // 显示网格线
calendar->setFirstDayOfWeek(Qt::Monday); // 设置每周第一天为周一
2.2 常用属性和方法
日期操作
// 设置和获取选中日期
void setSelectedDate(const QDate &date);
QDate selectedDate() const;// 设置日期范围
void setMinimumDate(const QDate &date);
void setMaximumDate(const QDate &date);
void setDateRange(const QDate &min, const QDate &max);// 获取当前显示的月份和年份
int monthShown() const;
int yearShown() const;// 导航到指定日期
void showDate(const QDate &date);
void showToday();
外观和行为
// 设置网格可见性
void setGridVisible(bool visible);// 设置周数显示
void setVerticalHeaderFormat(QCalendarWidget::VerticalHeaderFormat format);
// 例如:QCalendarWidget::NoVerticalHeader(不显示周数)// 设置水平表头格式
void setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat format);
// 例如:QCalendarWidget::ShortDayNames(显示缩写,如"周一")// 设置日期文本格式
void setDateTextFormat(const QDate &date, const QString &format);
选择模式
// 设置选择模式
void setSelectionMode(QCalendarWidget::SelectionMode mode);
// 例如:QCalendarWidget::SingleSelection(单选,默认)
** 信号与槽连接**
QCalendarWidget提供多种信号,常用的有:
// 选中日期变化时发出
void selectionChanged();// 当用户点击日历上的日期时发出
void activated(const QDate &date);// 当用户双击日历上的日期时发出
void clicked(const QDate &date);// 月份或年份变化时发出
void currentPageChanged(int year, int month);
示例:连接信号与槽:
// 方式1:选中日期变化时触发
connect(calendar, &QCalendarWidget::selectionChanged, [=]() {QDate selected = calendar->selectedDate();qDebug() << "选中日期:" << selected.toString("yyyy-MM-dd");
});// 方式2:点击日期时触发
connect(calendar, &QCalendarWidget::clicked, [=](const QDate &date) {qDebug() << "点击日期:" << date.toString("yyyy-MM-dd");
});// 方式3:月份或年份变化时触发
connect(calendar, &QCalendarWidget::currentPageChanged, [=](int year, int month) {qDebug() << "切换到:" << year << "年" << month << "月";
});
日期格式和本地化
// 设置显示的日期格式
calendar->setLocale(QLocale(QLocale::Chinese, QLocale::China)); // 设置为中文环境// 自定义日期文本格式(例如:高亮今天)
QTextCharFormat todayFormat;
todayFormat.setBackground(Qt::yellow);
calendar->setDateTextFormat(QDate::currentDate(), todayFormat);
2.3 示例
#include <QCalendarWidget>
#include <QVBoxLayout>
#include <QWidget>
#include <QLabel>
#include <QDate>class MyWidget : public QWidget {Q_OBJECT
public:MyWidget(QWidget *parent = nullptr) : QWidget(parent) {QVBoxLayout *layout = new QVBoxLayout(this);// 创建日历控件calendar = new QCalendarWidget(this);calendar->setGridVisible(true);calendar->setFirstDayOfWeek(Qt::Monday);// 设置日期范围(过去30天到未来30天)QDate today = QDate::currentDate();calendar->setMinimumDate(today.addDays(-30));calendar->setMaximumDate(today.addDays(30));// 创建标签显示选中日期selectedDateLabel = new QLabel("选中日期: " + today.toString("yyyy-MM-dd"), this);// 添加到布局layout->addWidget(calendar);layout->addWidget(selectedDateLabel);// 连接信号connect(calendar, &QCalendarWidget::selectionChanged, this, &MyWidget::onSelectionChanged);}private slots:void onSelectionChanged() {QDate selected = calendar->selectedDate();selectedDateLabel->setText("选中日期: " + selected.toString("yyyy-MM-dd"));}private:QCalendarWidget *calendar;QLabel *selectedDateLabel;
};
2.4 注意事项
- 日期范围:设置合理的日期范围可避免用户选择无效日期。
- 性能考虑:在需要处理大量日期的场景下,可通过
setDateTextFormat
预先设置格式,避免频繁更新。 - 国际化:通过
setLocale()
确保日历显示符合当地习惯。