QT入门

1. 各种布局

  • qt有五种布局
    垂直布局( vertically ),相关类: QVBoxLayout
    水平布局( horizontally )相关类: QHBoxLayout
    网格布局( grid)相关类: QGridLayout
    表格布局( form)相关类: QFormLayout
    堆栈布局( stack)相关类: QStackedLayout
基于Widget的GUI编程 - 布局.png

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. 按钮和弹簧

基于Widget的GUI编程-按钮控件.png

关于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
  • 按钮上可设置图标和布局方向:



    但是此方法不能布局图标和文字间距,而且无法上下布局

  • 给按钮添加响应快捷键:


    shortcut.jpg
2. QToolButton
  • QToolButton也能设置icon 和text的相对位置关系通过toolButtonStyle 设置
    toolButtonStyle
  • 为QToolButton 添加menu


    设置action
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设置验证。
QValidator
  • 可通过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

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

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

    1. 打开文件对话框
    1. 保存文件对话框
    1. 打开文件夹对话框
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,313评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,369评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,916评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,333评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,425评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,481评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,491评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,268评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,719评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,004评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,179评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,832评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,510评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,153评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,402评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,045评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,071评论 2 352

推荐阅读更多精彩内容