1. 各种布局
- qt有五种布局
垂直布局( vertically ),相关类: QVBoxLayout
水平布局( horizontally )相关类: QHBoxLayout
网格布局( grid)相关类: QGridLayout
表格布局( form)相关类: QFormLayout
堆栈布局( stack)相关类: QStackedLayout
1. 垂直布局( vertically ),相关类: QVBoxLayout
void MainWindow::setVerticalLayout()
{
QWidget *widget = new QWidget(this);
widget->setObjectName("widget");
widget->setGeometry(QRect(0, 0, 102, 100));
vl = new QVBoxLayout(widget);
vl->setObjectName("vl");
vl->setSpacing(6);
vl->setContentsMargins(10,20,10,20);
pb1 = new QPushButton(widget);
pb1->setObjectName("pb1");
pb1->setText("pb1");
vl->addWidget(pb1);
pb2 = new QPushButton(widget);
pb2->setObjectName("pb2");
pb2->setText("pb2");
vl->addWidget(pb2);
pb3 = new QPushButton(widget);
pb3->setObjectName("pb3");
pb3->setText("pb3");
vl->addWidget(pb3);
}
2. 水平布局( horizontally )相关类: QHBoxLayout
void MainWindow::setHorizontalLayout()
{
QWidget *widget = new QWidget(this);
widget->setObjectName("hWidget");
widget->setGeometry(QRect(100, 100, 300, 50));
hl = new QHBoxLayout(widget);
hl->setObjectName("hl");
hl->setContentsMargins(20,10,20,10);
hPb1 = new QPushButton("hPb1",widget);
hPb1->setObjectName("hPb1");
hl->addWidget(hPb1);
hPb2 = new QPushButton("hPb2",widget);
hPb2->setObjectName("hPb2");
hl->addWidget(hPb2);
hPb3 = new QPushButton("hPb3",widget);
hPb3->setObjectName("hPb3");
hl->addWidget(hPb3);
}
3. 网格布局( grid)相关类: QGridLayout
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName("MainWindow");
MainWindow->resize(481, 564);
centralwidget = new QWidget(MainWindow);
centralwidget->setObjectName("centralwidget");
widget = new QWidget(centralwidget);
widget->setObjectName("widget");
widget->setGeometry(QRect(20, 140, 341, 161));
gridLayout = new QGridLayout(widget);
gridLayout->setObjectName("gridLayout");
gridLayout->setContentsMargins(10, 10, 10, 10);
label = new QLabel(widget);
label->setObjectName("label");
gridLayout->addWidget(label, 0, 1, 1, 2);
label_2 = new QLabel(widget);
label_2->setObjectName("label_2");
gridLayout->addWidget(label_2, 0, 4, 1, 1);
label_3 = new QLabel(widget);
label_3->setObjectName("label_3");
gridLayout->addWidget(label_3, 0, 5, 1, 1);
label_7 = new QLabel(widget);
label_7->setObjectName("label_7");
gridLayout->addWidget(label_7, 1, 3, 1, 2);
label_6 = new QLabel(widget);
label_6->setObjectName("label_6");
gridLayout->addWidget(label_6, 2, 0, 1, 1);
label_5 = new QLabel(widget);
label_5->setObjectName("label_5");
gridLayout->addWidget(label_5, 2, 3, 1, 2);
label_8 = new QLabel(widget);
label_8->setObjectName("label_8");
gridLayout->addWidget(label_8, 2, 5, 1, 1);
label_4 = new QLabel(widget);
label_4->setObjectName("label_4");
gridLayout->addWidget(label_4, 3, 0, 1, 2);
label_10 = new QLabel(widget);
label_10->setObjectName("label_10");
gridLayout->addWidget(label_10, 4, 2, 1, 2);
label_9 = new QLabel(widget);
label_9->setObjectName("label_9");
gridLayout->addWidget(label_9, 4, 5, 1, 1);
MainWindow->setCentralWidget(centralwidget);
menubar = new QMenuBar(MainWindow);
menubar->setObjectName("menubar");
menubar->setGeometry(QRect(0, 0, 481, 24));
MainWindow->setMenuBar(menubar);
statusbar = new QStatusBar(MainWindow);
statusbar->setObjectName("statusbar");
MainWindow->setStatusBar(statusbar);
retranslateUi(MainWindow);
QMetaObject::connectSlotsByName(MainWindow);
} // setupUi
4. 表格布局( form)相关类: QFormLayout
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName("MainWindow");
MainWindow->resize(426, 564);
MainWindow->setMaximumSize(QSize(16777215, 16777215));
centralwidget = new QWidget(MainWindow);
centralwidget->setObjectName("centralwidget");
formLayoutWidget = new QWidget(centralwidget);
formLayoutWidget->setObjectName("formLayoutWidget");
formLayoutWidget->setGeometry(QRect(50, 170, 261, 131));
formLayout = new QFormLayout(formLayoutWidget);
formLayout->setObjectName("formLayout");
formLayout->setContentsMargins(10, 10, 10, 10);
label = new QLabel(formLayoutWidget);
label->setObjectName("label");
formLayout->setWidget(0, QFormLayout::LabelRole, label);
lineEdit = new QLineEdit(formLayoutWidget);
lineEdit->setObjectName("lineEdit");
formLayout->setWidget(0, QFormLayout::FieldRole, lineEdit);
label_2 = new QLabel(formLayoutWidget);
label_2->setObjectName("label_2");
formLayout->setWidget(2, QFormLayout::LabelRole, label_2);
lineEdit_2 = new QLineEdit(formLayoutWidget);
lineEdit_2->setObjectName("lineEdit_2");
formLayout->setWidget(2, QFormLayout::FieldRole, lineEdit_2);
pushButton = new QPushButton(formLayoutWidget);
pushButton->setObjectName("pushButton");
formLayout->setWidget(3, QFormLayout::LabelRole, pushButton);
pushButton_2 = new QPushButton(formLayoutWidget);
pushButton_2->setObjectName("pushButton_2");
formLayout->setWidget(3, QFormLayout::FieldRole, pushButton_2);
MainWindow->setCentralWidget(centralwidget);
menubar = new QMenuBar(MainWindow);
menubar->setObjectName("menubar");
menubar->setGeometry(QRect(0, 0, 426, 24));
MainWindow->setMenuBar(menubar);
statusbar = new QStatusBar(MainWindow);
statusbar->setObjectName("statusbar");
MainWindow->setStatusBar(statusbar);
#if QT_CONFIG(shortcut)
label->setBuddy(label);
#endif // QT_CONFIG(shortcut)
QWidget::setTabOrder(lineEdit, lineEdit_2);
QWidget::setTabOrder(lineEdit_2, pushButton_2);
QWidget::setTabOrder(pushButton_2, pushButton);
retranslateUi(MainWindow);
QMetaObject::connectSlotsByName(MainWindow);
} // setupUi
5. 堆栈布局( stack)相关类: QStackedLayout
void MainWindow::setStackLayout()
{
Form1 *f1 = new Form1();
Form2 *f2 = new Form2();
stackLayout = new QStackedLayout();
ui->verticalLayout->addLayout(stackLayout);
stackLayout->addWidget(f1);
stackLayout->addWidget(f2);
}
void MainWindow::on_pushButton_clicked()
{
int index = stackLayout->currentIndex();
stackLayout->setCurrentIndex(!index);
}
2. 按钮和弹簧
关于sizePolicy
- Fixed:固定大小,大小取自sizeHint,不可伸展和收缩
- Minimum:widget的最小值就是sizeHint,可伸展,不能比sizeHint小
- Maximum:widget的最大值就是sizeHint,可收缩,不能比minimumSizeHint小
- Preferred:sizeHint的大小就是最好的,不过也可拉伸和收缩。
- Expanding:可以伸展,可以尽可能多的占据空白,也就是拉伸
- MinimumExpanding:可以使用多余的空白lgnored:忽略sizeHint获取的大小,也可尽可能多的占据空白
- Expanding 和 Preferred的区别:当一个form包含两者的widget,该form大小变化时,额外的空白处则给予Expanding widget,而Preferred widget保持为其sizehint的大小
SizePolicy的应用场景
- 控件一块扩展
- 左边扩展,右边保持不变
- 右边扩展,左边保持不变
- 控件保持不变
- 中间扩展,两边保持不变
- 两边扩展,中间保持不变
关于sizeHint函数
- 当widget 在屏幕显示的时候,sizeHint 为widget提供一个适当的尺寸。
#ifndef PUSHBUTTON_H
#define PUSHBUTTON_H
#include <QWidget>
#include <QPushButton>
class PushButton : public QPushButton
{
Q_OBJECT
public:
explicit PushButton(QWidget *parent = nullptr);
virtual QSize sizeHint() const override;
signals:
};
#endif // PUSHBUTTON_H
#include "pushbutton.h"
PushButton::PushButton(QWidget *parent)
: QPushButton{parent}
{
}
QSize PushButton::sizeHint() const
{
return QSize(200, 50);
}
1. 弹簧控件
- 垂直(vertically),相关类:QSpacerltem
- 水平( horizontally)相关类:QSpacerltem
- 继承自:QLayoutltem可放入Layout中
2. 按钮控件
1. QPushButton
-
按钮上可设置图标和布局方向:
但是此方法不能布局图标和文字间距,而且无法上下布局
-
给按钮添加响应快捷键:
2. QToolButton
-
QToolButton也能设置icon 和text的相对位置关系通过toolButtonStyle 设置
-
为QToolButton 添加menu
void MainWindow::setToolButtonMenus()
{
menu.addAction(ui->action);
menu.addAction(ui->action2);
ui->toolButton->setMenu(&menu);
}
3. QRadioButton
- 在同一parent上的QRadioButton是互斥的。
4. QCheckBox
- QCheckBox可通过tristate属性添加第三种状态。
5. QDialogButtonBox
- 可以通过standardButtons添加各种选项
- 凡是保存或同意的都是接受响应事件,否则为拒绝。
- 但是运行效果是英文,是因为没有国际化。
QApplication a(argc, argv);
QTranslator translator(0);
translator.load("Test_zh_CN.qm",".");
a.installTranslator(&translator);
3. 输入控件
1. QComboBox
- QComboBox可以设置editable 让QComboBox可编辑。
- QComboBox可设置insertPolicy 插入策略。
- QComboBox可以通过validator设置验证。
- 可通过QStringListModel 设置选项。
QStringListModel *model = new QStringListModel;
QStringList list;
list<< "a" << "b" << "c";
model->setStringList(list);
ui->comboBox->setModel(model);
2. QFontComboBox
- 继承自QComboBox,用法简单。
3. QLineEdit
- 通过echoModel设置是否是密码方式输入
4. QTextEdit
- autoFormatting 设置为autoBulletList 可以输入格式
- tabChangesFocus = true 点击tab可以改变focus 而不是tab空格
- acceptRichText 可以粘贴html
5. QPlainTextEdit
- 只能编辑纯文本
- maxmunBlockCount : 最大块数。
6. QSpinBox
- accelerated : 加速增加或减小
- buttonSymbols: 设置加减按钮样式
- specilValueText: 默认值
- singleStep : 增加幅度
- displayIntegerBase : 显示的进制
7. QTimeEdit
- currentSection : 当前分节,比如HourseSection
- displayFormat : 显示格式 比如:HH:mm:ss
- timeSpec : 时区
8. QDateEdit
- calenderPopup : 可以弹出日历
9. QDial
- notchesVisible : 添加刻度
10. QSlider
- orientation: 指定方向
- tickPostion : 设置刻度位置
11. QKeySequeneEdit
- 功能就是显示快捷键
void MainWindow::on_keySequenceEdit_keySequenceChanged(const QKeySequence &keySequence)
{
if(keySequence == QKeySequence("Ctrl+X"))
{
QMessageBox::StandardButton btn = QMessageBox::warning(this,"提醒","是否关闭",
QMessageBox::StandardButton::Yes | QMessageBox::StandardButton::No);
if(btn == QMessageBox::StandardButton::Yes){
this->close();
}
}
}
4. 显示控件
1. QLabel
- scaleContents: 根据Qlabel大小缩放
- 可以将文字设置成超级链接
- openExtenalLinks: 打开超级链接
- buddy: 可以设置伙伴关系
2. QTextBrowser
- 继承自QTextEdit,只能作为浏览
- 只能显示本地文件,不能显示网络文件 ,从serchPath下搜索source
- 支持html子集,不支持所以html标签。
- openLinks: 只能打开内部文件,网页链接打不开
- openExtenalLinks: 用系统浏览器打开链接
3. QGraphicView
- 由QGraphicScene 和 QGraphicItem 共同使用才能显示相应的内容。
QGraphicsScene *scene = new QGraphicsScene();
QGraphicsTextItem *item = new QGraphicsTextItem("QGraphics View ...");
scene->addItem(item);
ui->graphicsView->setScene(scene);
4. QCalenderWidget
- dateEditEnable : 可以通过键盘编辑日期
5. QLCDNumber
- digitCount: 位数
- mode: 进制
- segmentStyle: 填充样式或扁平样式等
6. QProgressBar
- textVisiable : 是否显示百分比
void MainWindow::timerEvent(QTimerEvent *event)
{
index_ ++;
if(index_ == ui->progressBar->maximum()){
this->killTimer(timerId_);
index_ = 0;
}
ui->progressBar->setValue(index_);
}
7. 水平线、垂直线
- 本质就是QFrame
line = new QFrame(centralwidget);
line->setObjectName("line");
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
verticalLayout->addWidget(line);
5. itemWidget
1. QListWidget
QListWidget类提供了一个基于项目的列表控件,而不是基于模型的列表控件,列表控件需要QListWidget和QListWidgetltem一块使用
使用方法:
1:直接调用insertltem或者addltem添加项。dragEnable : 可拖拽
dragDropMode : 退拽样式
viewMode : listMode:图片左文字右,iconMode:图片上文字下
QListWidgetItem *item = new QListWidgetItem(QIcon(":/coure_back_1.png"),"返回");
ui->listWidget->addItem(item);
ui->listWidget->setViewMode(QListWidget::ListMode);
2. QTreeWidget
- 使用方法:
1:调用setColumnCount确定列个数
2:调用insertTopLevetltem或者addTopLevelltem添加节点
3:调用QTreeWidgetltem的addChild或者insertChild添加子节点 - itemsExpandable : 项目可展开
- sortingEnable : 排序
ui->treeWidget_2->setColumnCount(2);
QStringList list;
list << "1" << "2";
QTreeWidgetItem *treeItem = new QTreeWidgetItem(list);
ui->treeWidget_2->addTopLevelItem(treeItem);
QStringList list1;
list1<< "List widget" << "列表控件";
QTreeWidgetItem *treeItem1 = new QTreeWidgetItem(list1);
treeItem->addChild(treeItem1);
QStringList list2;
list2<< "Tree widget" << "树控件";
QTreeWidgetItem *treeItem2 = new QTreeWidgetItem(list2);
treeItem->addChild(treeItem2);
QStringList list3;
list3<< "Table widget" << "表格控件";
QTreeWidgetItem *treeItem3 = new QTreeWidgetItem(list3);
treeItem->addChild(treeItem3);
3. QTableWidget
- QTableWidget 和必须和QTableWidgetltem一块使用
- 使用方法:
1:调用setRowCount和setColumnCount确定行和列的个数
2:调用setltem设置ltem - showGrid : 显示网格
- cornerButtonClick:左上角是否可点击
ui->tableWidget_2->setColumnCount(2);
ui->tableWidget_2->setRowCount(3);
for (int i = 0; i < 2; ++i) {
QTableWidgetItem *item = new QTableWidgetItem("列"+QString::number(i+1));
ui->tableWidget_2->setHorizontalHeaderItem(i,item);
}
for (int j = 0; j < 3; ++j) {
QTableWidgetItem *item = new QTableWidgetItem("行"+QString::number(j+1));
ui->tableWidget_2->setVerticalHeaderItem(j,item);
}
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
QTableWidgetItem *item = new QTableWidgetItem(QString::number(j+1)+QString::number(i+1));
ui->tableWidget_2->setItem(j,i,item);
}
}
6. ItemViews
1. QListView
- 通过QStringListModel 设置
QStringList list;
list << "a" << "b" << "c";
QStringListModel *model = new QStringListModel;
model->setStringList(list);
ui->listView->setModel(model);
- 通过QStandardItemModel 设置
QStandardItem *item1 = new QStandardItem(QIcon(":/coure_back_1.png"),"返回");
QStandardItem *item2 = new QStandardItem(QIcon(":/course_time.png"),"时间");
QStandardItem *item3 = new QStandardItem(QIcon(":/preview_img.png"),"预习");
QStandardItem *item4 = new QStandardItem(QIcon(":/ready_learning.png"),"准备");
QStandardItemModel *model2 = new QStandardItemModel();
model2->appendRow(item1);
model2->appendRow(item2);
model2->appendRow(item3);
model2->appendRow(item4);
ui->listView_2->setModel(model2);
2. QTreeView
void MainWindow::setTreeView()
{
QStandardItem *item1 = new QStandardItem(QIcon(":/coure_back_1.png"),"返回");
for (int i = 0; i < 3; ++i) {
item1->appendRow(new QStandardItem(QString("child%1").arg(i+1)));
}
QStandardItem *item2 = new QStandardItem(QIcon(":/course_time.png"),"时间");
for (int i = 0; i < 4; ++i) {
item2->appendRow(new QStandardItem(QString("child%1").arg(i+1)));
}
QStandardItem *item3 = new QStandardItem(QIcon(":/preview_img.png"),"预习");
for (int i = 0; i < 5; ++i) {
item3->appendRow(new QStandardItem(QString("child%1").arg(i+1)));
}
QStandardItem *item4 = new QStandardItem(QIcon(":/ready_learning.png"),"准备");
for (int i = 0; i < 6; ++i) {
item4->appendRow(new QStandardItem(QString("child%1").arg(i+1)));
}
QStandardItemModel *model2 = new QStandardItemModel();
model2->appendRow(item1);
model2->appendRow(item2);
model2->appendRow(item3);
model2->appendRow(item4);
ui->treeView->setModel(model2);
ui->treeView->header()->setVisible(false);
}
3. QTableView
void MainWindow::setTableView()
{
QStandardItemModel *model = new QStandardItemModel();
for (int row = 0; row < 3; ++row) {
QList<QStandardItem *> items;
for (int colum = 0; colum < 5; ++colum) {
items << new QStandardItem("row:" + QString::number(row+1) + " colum:"+QString::number(colum+1));
}
model->appendRow(items);
}
ui->tableView->setModel(model);
}
4. QColumView
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "viewform.h"
#include <QFileSystemModel>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_columnView_clicked(const QModelIndex &index);
private:
Ui::MainWindow *ui;
void setListView();
void setTreeView();
void setTableView();
void setColumView();
void setViewForm();
QFileSystemModel *fileModel;
ViewForm *_view;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStringListModel>
#include <QStandardItemModel>
#include <QList>
#include <QDir>
#include <QMimeType>
#include <QMimeDatabase>
#include <QDateTime>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setListView();
setTreeView();
setTableView();
setColumView();
setViewForm();
}
void MainWindow::setColumView()
{
fileModel = new QFileSystemModel();
fileModel->setRootPath(QDir::currentPath());
ui->columnView->setModel(fileModel);
}
void MainWindow::setViewForm()
{
_view = new ViewForm();
ui->columnView->setPreviewWidget(_view);
}
MainWindow::~MainWindow()
{
delete ui;
delete fileModel;
}
void MainWindow::on_columnView_clicked(const QModelIndex &index)
{
QString name = fileModel->fileName(index);
QFileInfo info = fileModel->fileInfo(index);
qint64 size = info.size() / 1024;
QMimeDatabase database;
QMimeType mimeType = database.mimeTypeForFile(info);
QString type = mimeType.name();
QString modified = info.lastModified().toString();
_view->setName(name);
_view->setSize(size);
_view->setType(type);
_view->setModified(modified);
_view->setFilePath(fileModel->filePath(index));
}
#ifndef VIEWFORM_H
#define VIEWFORM_H
#include <QWidget>
namespace Ui {
class ViewForm;
}
class ViewForm : public QWidget
{
Q_OBJECT
public:
explicit ViewForm(QWidget *parent = nullptr);
~ViewForm();
void setName(const QString &name);
void setSize(const qint64 size);
void setType(const QString &type);
void setModified(const QString &modified);
void setFilePath(const QString &path);
private:
Ui::ViewForm *ui;
};
#endif // VIEWFORM_H
#include "viewform.h"
#include "ui_viewform.h"
ViewForm::ViewForm(QWidget *parent)
: QWidget(parent)
, ui(new Ui::ViewForm)
{
ui->setupUi(this);
}
void ViewForm::setName(const QString &name)
{
ui->label_2->setText(name);
}
void ViewForm::setSize(const qint64 size)
{
ui->label_4->setText(QString::number(size));
}
void ViewForm::setType(const QString &type)
{
ui->label_6->setText(type);
}
void ViewForm::setModified(const QString &modified)
{
ui->label_8->setText(modified);
}
void ViewForm::setFilePath(const QString &path)
{
ui->label_9->setPixmap(QPixmap(path));
}
ViewForm::~ViewForm()
{
delete ui;
}
7. 容器控件
1. QGroupBox
我们称之为组合框,使用方法是容器控件中最简单的。
- flat: 去掉框线
- checkable: 为title添加复选框
- checked: 如果不选择checked 将整体变灰
2. QScrollArea
他提供一个可滚动的区域
3. QToolBox 抽屉控件
-
不适合很多抽屉的效果
4. QTabWidget
- elideMode : 显示省略方式
- usesScrollButtons: QTabWidget可滚动
- documentMode: tab显示样式变成document样式
- moveable: tab项可移动
- tabsCloseable: tab项上显示关闭按钮
void MainWindow::on_tabWidget_currentChanged(int index)
{
QMessageBox::information(this,"提醒",ui->tabWidget->tabText(index),QMessageBox::Ok);
}
void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
ui->tabWidget->removeTab(index);
}
5. QStackedWidget
- 很像QStackedLayout ,同时只能显示一个wedget
void MainWindow::keyPressEvent(QKeyEvent *event)
{
if(event->key() == Qt::Key_Down)
{
int index = ui->stackedWidget->currentIndex();
++index;
index = index >= ui->stackedWidget->count() ? 0 : index;
ui->stackedWidget->setCurrentIndex(index);
}
}
6. QFrame And QWidget
- QFrame的frameShape可以设置水平线和垂直线
- QFrame可以将其他自定义控件进行提升
7. MdiArea 多文档显示器
- viewMode: SubWindowView子文档窗口、tabWindowView tab样式的窗口
8. QDockWidget
提供了一个可以在QMainWindow中停靠或浮动在桌面上的顶层窗口小部件 关闭按钮并不会把这个 Dock Widget 从内存中删除掉,只是隐藏了他的显示。
我们可以通过按着键盘的 ctrl 键然后双击标题恢 复它的原来位置
8. 其他控件
1. QDialog
2. QFileDialog
- 打开文件对话框
- 保存文件对话框
- 打开文件夹对话框