QComboBox 以占用最少屏幕空间数量的方式,向用户提供呈现选项列表的手段。
组合框是显示当前项的选择 Widget,且可以弹出可选择项的列表。组合框可能是可编辑的,使用户能够修改每列表项。
组合框可以包含像素图及字符串; insertItem () 和 setItemText () 函数适合被重载。对于可编辑组合框,函数 clearEditText () 的提供以清零显示字符串无需改变组合框内容。
会发射 3 个信号若组合框当前项改变, currentIndexChanged (), currentTextChanged () 和 activated (). currentIndexChanged () 和 currentTextChanged () 始终发射,无论改变是通过编程方式还是通过用户交互完成,而 activated () 才被发射当通过用户交互导致改变时。 highlighted () 信号被发射当用户突显组合框弹出列表项时。所有 3 信号均有 2 个版本,一个带有 QString 自变量和一个带有 自变量。若用户选择或突显像素图,仅 信号被发射。每当可编辑组合框文本改变时 editTextChanged () 信号被发射。 int int
当用户在可编辑组合框中录入新字符串时,可能插入或可能不插入 Widget,且可以将 Widget 插入在多个位置。默认策略是 InsertAtBottom 但可以改变这使用 setInsertPolicy ().
可以将输入约束到可编辑组合框使用 QValidator ;见 setValidator ()。默认情况下,接受任何输入。
可以使用插入函数填充组合框, insertItem () 和 insertItems () 例如。可以改变项采用 setItemText ()。可以移除项采用 removeItem () 和可以移除所有项采用 clear ()。返回当前项文本通过 currentText (),并采用 text() 返回编号项的文本。可以设置当前项采用 setCurrentIndex ()。返回组合框的项数通过 count ();可以设置最大项数采用 setMaxCount ()。可以允许编辑使用 setEditable ()。对于可编辑组合框,可以设置自动补全使用 setCompleter () 和设置用户是否可以重复添加采用 setDuplicatesEnabled ().
QComboBox 使用 模型/视图框架 用于其弹出列表并存储其项。默认情况下 QStandardItemModel 存储项和 QListView 子类显示弹出列表。可以直接访问模型和视图 (采用 model () 和 view ()),但 QComboBox 还提供用来设置和获取项数据的函数 (如 setItemData () 和 itemText ())。还可以设置新的模型和视图 (采用 setModel () 和 setView ())。对于组合框标签文本和图标,模型数据拥有 Qt::D isplayRole and Qt::D ecorationRole 在使用。注意:不可以更改 SelectionMode 的 view (),如通过使用 setSelectionMode() .
创建一个QMainWindow工程。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QComboBox *cb;
private slots:
void comboboxIndex(int);
};
#endif // MAINWINDOW_H
mainwindow.cpp
首先添加两个项目。
cb=new QComboBox(this);
cb->setGeometry(10,10,200,30);
cb->addItem("北京市");
cb->addItem("上海市");
实现信号与槽函数。
connect(cb,SIGNAL(currentIndexChanged(int)),this,SLOT(comboboxIndex(int)));
void MainWindow::comboboxIndex(int index)
{
qDebug()<<"你选择的地区是:"<itemText(index)<itemText(index),QMessageBox::Yes|QMessageBox::No);
mb.exec();
}
此信号被发送每当 currentIndex 在组合框透过用户交互或编程方式改变。项的 index 被传递或 -1,若组合框变为空或 currentIndex 被重置。
完整代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setGeometry(100,200,1000,600);
cb=new QComboBox(this);
cb->setGeometry(10,10,200,30);
cb->addItem("北京市");
cb->addItem("上海市");
connect(cb,SIGNAL(currentIndexChanged(int)),this,SLOT(comboboxIndex(int)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::comboboxIndex(int index)
{
qDebug()<<"你选择的地区是:"<itemText(index)<itemText(index),QMessageBox::Yes|QMessageBox::No);
mb.exec();
}
组合框中填充了按字母顺序排列的字体系列名称列表,例如 Arial、Helvetica 和 Times New Roman。如果可能,将使用实际字体显示姓氏。对于 Symbol 等字体,如果名称在字体本身中无法表示,则字体示例将显示在系列名称旁边。
QFontComboBox 通常用于工具栏中,与用于控制字体大小的 QComboBox 和用于粗体和斜体的两个 QToolButton 结合使用。
当用户选择新字体时,除了 currentIndexChanged () 之外,还会发出 currentFontChanged () 信号。
调用 setWritingSystem () 告诉 QFontComboBox 只显示支持给定书写系统的字体,调用 setFontFilters () 过滤掉某些类型的字体,例如不可缩放字体或等宽字体。
创建一个QMainWindow工程。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QFontComboBox *fcb;
QLabel *lb;
private slots:
void func(QFont);
};
#endif // MAINWINDOW_H
创建QFontComboBox和QLabel对象,并且设置一个位置。
fcb=new QFontComboBox(this);
lb=new QLabel(this);
fcb->setGeometry(10,50,200,30);
lb->setGeometry(10,70,300,50);
实现信号与槽函数。
connect(fcb,SIGNAL(currentFontChanged(QFont)),this,SLOT(func(QFont)));
void MainWindow::func(QFont index)
{
lb->setFont(index);
QString str="CSDN博客";
lb->setText(str);
}
每当当前字体更改时,都会发出此信号,使用新字体 。
行编辑允许用户键入和编辑单行纯文本,采用有用编辑功能的集合,包括:撤消/重做、剪切/粘贴及拖放 (见 setDragEnabled ()).
通过改变 echoMode () 为行编辑,它还可以用作只写字段 (用于密码之类的输入)。
可以把文本长度约束到 maxLength ()。可以任意约束文本使用 validator () 或 inputMask (),或两者。当在同一行编辑的验证器和输入掩码之间切换时,最好清零验证器或输入掩码,以防未定义行为。
相关类 QTextEdit 允许多行,编辑富文本。
可以改变文本采用 setText () 或 insert ()。文本的检索采用 text ();显示文本 (可能不同,见 EchoMode ) 的检索采用 displayText ()。可以选择文本采用 setSelection () 或 selectAll (), 且选择可以被 cut (), copy () 和 paste ()。可以对齐文本采用 setAlignment ().
当文本改变时 textChanged () 信号被发射;当文本改变时,除了通过调用 setText () textEdited () 信号被发射;当光标移动时 cursorPositionChanged () 信号被发射;而当按下 Return 或 Enter 键时 returnPressed () 信号被发射。
当编辑完成时,由于行编辑失去聚焦或按下 Return/Enter 键 editingFinished () 信号被发射。
注意:若行编辑有设置验证器, returnPressed ()/ editingFinished () 信号才会被发射,若验证器返回 QValidator::Acceptable .
默认情况下,QLineEdit 拥有由平台风格指南指定的框架;可以关闭它通过调用 setFrame (false).
默认键绑定的描述见下文。行编辑还提供上下文菜单 (通常通过鼠标右键援引),呈现这些编辑选项中的一些。
创建一个QMainWindow工程
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QLineEdit *le;
QPushButton *pb;
QLabel *lb;
private slots:
void click();
};
#endif // MAINWINDOW_H
mainwindow.cpp
实例化对象
le=new QLineEdit(this);
le->setGeometry(10,150,200,30);
pb=new QPushButton(this);
pb->setGeometry(220,150,100,30);
pb->setText("点击我");
lb=new QLabel(this);
lb->setGeometry(10,200,400,30);
lb->setText("你输入的内容为:");
实现信号和槽函数,通过QLabel显示QLineEdit的编辑。
connect(pb,SIGNAL(clicked()),this,SLOT(click()));
void MainWindow::click()
{
QString str="你输入的内容为:";
str=str+le->text();
lb->setText(str);
le->clear();
}
点击按钮
清零行编辑的内容。
与之类似的还有文本编辑器QTextEdit,这里就不再阐述了。
QPlainTextEdit 是支持纯文本的高级查看器/编辑器。经优化,它能处理大文档和快速响应用户输入。
QPlainText 使用了一样的技术和概念,如 QTextEdit ,但为纯文本处理进行了优化。
QPlainTextEdit 工作于段落和字符。段落是自动换行以拟合 Widget 宽度的格式化字符串。默认情况下,当读取纯文本时,一个换行符表示一个段落。文档由零个或多个段落组成。段落由硬换行符分隔。段落中的每个字符均有其自己的属性,例如:字体和颜色。
QPlainTextEdit 中的鼠标光标形状为 Qt::IBeamCursor 默认情况下。它可以被改变透过 viewport () 的光标特性。
创建一个QMainWindow工程
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QPlainTextEdit *pte;
QRadioButton *rb;
private slots:
void click();
};
#endif // MAINWINDOW_H
mainwindow.cpp
实例化对象
pte=new QPlainTextEdit(this);
pte->setGeometry(10,250,400,200);
rb=new QRadioButton(this);
rb->setGeometry(300,220,200,30);
rb->setText("只读模式");
设置工作目录为可执行程序的工作目录并加载到文件流
QDir::setCurrent(QCoreApplication::applicationDirPath());
QFile fe("D:/main.txt");
fe.open((QFile::ReadOnly|QFile::Text));
QTextStream ts(&fe);
pte->insertPlainText(ts.readAll());
将应用程序的当前工作目录设置为path。如果目录已成功更改,则返回true;否则返回false。
返回包含应用程序可执行文件的目录。
例如,如果您在C:\Qt目录下安装了Qt,并且运行regexp示例,该函数将返回"C:/Qt/examples/tools/regexp"。
在macOS和iOS上,这将指向实际包含可执行文件的目录,该目录可能位于应用程序包中(如果应用程序是捆绑的)。
警告:在Linux上,此函数将尝试从/proc文件系统获取路径。如果失败,它假定argv[0]包含可执行文件的绝对文件名。该函数还假定应用程序没有更改当前目录。
在当前光标位置插入文本的方便槽。
读取流的全部内容,并将其作为QString返回。在处理大文件时避免使用此函数,因为它将消耗大量内存。
如果不知道有多少数据可用,调用readLine()更好。
实现信号与槽函数,实现只读模式
connect(rb,SIGNAL(clicked()),this,SLOT(click()));
void MainWindow::click()
{
if(rb->isChecked())
{
pte->setReadOnly(true);
}
else
{
pte->setReadOnly(false);
}
}
完整代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
pte=new QPlainTextEdit(this);
pte->setGeometry(10,250,400,200);
rb=new QRadioButton(this);
rb->setGeometry(300,220,200,30);
rb->setText("只读模式");
QDir::setCurrent(QCoreApplication::applicationDirPath());
QFile fe("D:/main.txt");
fe.open((QFile::ReadOnly|QFile::Text));
QTextStream ts(&fe);
pte->insertPlainText(ts.readAll());
connect(rb,SIGNAL(clicked()),this,SLOT(click()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::click()
{
if(rb->isChecked())
{
pte->setReadOnly(true);
}
else
{
pte->setReadOnly(false);
}
}
QSpinBox 旨在处理整数和离散值的集 (如:月份名);使用 QDoubleSpinBox 为浮点值。
QSpinBox允许用户通过单击向上/向下按钮或按键盘上的向上/向下来增加/减少当前显示的值来选择值。用户还可以手动键入值。数字显示框支持整数值,但可以扩展为使用 validate ()、 textFromValue () 和 valueFromText () 的不同字符串。
每次值更改时,QSpinBox 都会发出 valueChanged () 和 textChanged () 信号,前者提供 int,后者提供 QString 。 textChanged () 信号提供带有前缀 () 和后 缀 () 的值。可以使用 () 获取当前值,并设置采用 setValue ()。
单击向上/向下按钮或使用键盘快捷键的向上和向下箭头将以大小为 singleStep () 的步长增加或减少当前值。如果要更改此行为,可以重新实现虚函数 stepBy ()。最小值和最大值以及步长可以使用其中一个构造函数进行设置,以后可以使用 setMinimum ()、 setMaxim( ) 和 setSingleStep () 进行更改。
大多数旋转框是定向的,但QSpinBox也可以作为圆形旋转框运行,即如果范围是0-99,当前值是99,如果包装 ()设置为true,单击“向上”将给出0。如果需要循环行为,请使用 setWrapping ()。
显示的值可以预先添加和附加任意字符串,例如指示货币或度量单位。参见 setPrefix () 和 setSuffix ()。使用文本 ()(包括任何前缀 () 和后缀 ())或使用 cleanText ()(没有前 缀 ()、后缀 () 且没有前 导或尾随空格)检索数字显示框中的文本。
除了数值范围之外,通常还希望为用户提供特殊(通常是默认)选择。参见 setSpecialValueText () 了解如何使用 QSpinBox 执行此操作。
创建一个QMainWindow工程
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QSpinBox *spb;
private slots:
void changed(int);
};
#endif // MAINWINDOW_H
mainwindow.cpp
初始化旋转框
this->setStyleSheet("QMainWindow{background-color:rgba(250,220,120,100%)}");
spb=new QSpinBox(this);
spb->setGeometry(440,250,150,30);
spb->setRange(0,100);
spb->setSingleStep(10);
spb->setValue(100);
spb->setSuffix("%不透明度");
方便的函数,通过单个函数调用设置最小 值和 最大值.
将数字显示框的步骤类型设置为 stepType ,即单步或自适应十进制步骤。
自适应十进制步长是指步长将连续调整到低于当前电流的十次方。因此,当值为 1100 时,步长设置为 100,因此步进一次将其增加到 1200。对于 1200,升级将其带到 1300。对于负值,从 -1100 下降到 -1200。
在处理边缘情况时会考虑步进方向,因此从 100 降级会将值降至 99 而不是 90。因此,上一级,然后下降一级,反之亦然,总是落在起始值上;99 -> 100 -> 99.
设置此值将导致数字显示框忽略 singleStep 的值,尽管它会保留,以便在以后关闭自适应十进制步骤时 singleStep 生效。
注意: Setter 函数对于特性 stepType .
此属性保存旋转框的后缀
后缀被附加到显示值的末尾。典型的用途是显示计量单位或货币符号。
实现信号和槽函数,使得窗口随着数值的大小改变透明度。
connect(spb,SIGNAL(valueChanged(int)),this,SLOT(changed(int)));
void MainWindow::changed(int v)
{
double x=(double)v/100;
this->setWindowOpacity(x);
}
每当旋转箱的值发生变化时,就会发出这个信号。新值的整数值在i中传递。
此属性保存窗口的不透明度级别。
不透明度的有效范围是从1.0(完全不透明)到0.0(完全透明)。
默认情况下,此属性的值为1.0。
该特性在支持Composite扩展的嵌入式Linux、macOS、Windows和X11平台上可用。
完整代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setStyleSheet("QMainWindow{background-color:rgba(250,220,120,100%)}");
spb=new QSpinBox(this);
spb->setGeometry(440,250,150,30);
spb->setRange(0,100);
spb->setSingleStep(10);
spb->setValue(100);
spb->setSuffix("%不透明度");
connect(spb,SIGNAL(valueChanged(int)),this,SLOT(changed(int)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::changed(int v)
{
double x=(double)v/100;
this->setWindowOpacity(x);
}
接下来介绍三个时间控件,分别是时间编辑QTimeEdit、日期编辑QDateEdit和日期时间编辑QDateTimeEdit
由 QTimeEdit 提供的很多特性和函数都有实现在 QDateTimeEdit 。这些是此类的相关特性:
QDateEdit提供的很多属性和函数都是在QDateTimeEdit 中实现的。这些是此类的相关特性:
QDateTimeEdit 允许用户通过使用键盘或箭头键递增/递减日期、时间值来编辑日期。箭头键可用于从 QDateTimeEdit 框一区域移至另一区域。日期和时间按设置格式出现;
创建一个QMainWindow工程
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QTimeEdit *te;
QDateEdit *de;
QDateTimeEdit *dte;
};
#endif // MAINWINDOW_H
mainwindow.cpp
实现显示当前时间
dte=new QDateTimeEdit(QDateTime::currentDateTime(),this);
dte->setGeometry(440,290,200,30);
te=new QTimeEdit(QTime::currentTime(),this);
te->setGeometry(440,330,200,30);
de=new QDateEdit(QDate::currentDate(),this);
de->setGeometry(440,370,200,30);
滚动条是控件,使用户能够访问大于用于显示文档的 Widget 的文档部分。它为用户提供当前文档位置及可见文档数量的视觉指示。滚动条通常装备有其它控件,使导航更精确。Qt 以适合各平台的方式显示滚动条。
如果您需要在另一个小部件上提供滚动视图,则使用 QScrollArea 类可能更方便,因为它提供了视口小部件和滚动条。如果您需要使用 QAbstractScrollArea 为专用小部件实现类似的功能,QScrollBar 非常有用;例如,如果您决定将 QAbstractItemView 作为子类。对于使用滑块控件获取给定范围内的值的大多数其他情况,QSlider 类可能更适合您的需求。
每个滚动条都有一个值,该值指示滑块与滚动条起点之间的距离;这是通过 () 和设置采用 setValue () 获得的。此值始终位于为滚动条定义的值范围内,包括 minimum() 到 maximum()。 可接受值的范围可以使用 setMinimum () 和 setMaxim () 进行设置。在最小值下,滑块的上边缘(对于垂直滚动条)或左边缘(对于水平滚动条)将位于滚动条的顶部(或左端)。在最大值处,滑块的底部(或右侧)边缘将位于滚动条的底部(或右侧)末端。
滑块的长度通常与页面步长的值有关,通常表示滚动视图中显示的文档区域的比例。页面步长是用户按下 Page Up 和 Page Down 键时值更改的量,并使用 setPageStep () 进行设置。使用光标键对行步长定义的值进行较小的更改,并且此数量是使用 setSingleStep() 设置的。
请注意,使用的值范围与滚动条小部件的实际大小无关。在为范围和页面步骤选择值时,无需考虑这一点。
为滚动条指定的值范围通常与QSlider的值范围不同,因为需要考虑滑块的长度。如果我们有一个有 100 行的文档,并且我们只能在小部件中显示 20 行,我们可能希望构造一个页面步长为 20、最小值为 0、最大值为 80 的滚动条。这将为我们提供一个包含五个“页面”的滚动条。
QScrollBar 仅提供整数范围。请注意,尽管 QScrollBar 处理非常大的数字,但当前屏幕上的滚动条无法有效地表示超过 100,000 像素的范围。除此之外,用户很难使用键盘或鼠标控制滑块,并且滚动箭头的使用将受到限制。
ScrollBar 继承了 QAbstractSlider 的一整套信号:
滚动条可以由键盘控制,但它默认有一个 Qt::NoFocus 的 focusPolicy () 。使用 setFocusPolicy () 启用键盘与滚动条的交互:
可以通过使用 triggerAction() 函数来模拟用户与滚动条控件的交互来控制滑块本身。如果您有许多不同的小部件使用共同的值范围,这将非常有用。
大多数 GUI 样式使用 pageStep () 值来计算滑块的大小。
创建一个QMainWindow工程
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QScrollBar *vs,*hs;
};
#endif // MAINWINDOW_H
mainwindow.cpp
实例化对象
hs=new QScrollBar(Qt::Horizontal,this);
hs->setGeometry(0,500,1000,30);
vs=new QScrollBar(Qt::Vertical,this);
vs->setGeometry(500,0,30,500);
这个小部件允许用户选择一个 QKeySequence ,它通常用作快捷方式。录制在小部件接收到焦点时启动,并在用户释放最后一个键一秒后结束。
创建一个QMainWindow工程
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QKeySequenceEdit *kse;
private slots:
void changed(const QKeySequence &);
};
#endif // MAINWINDOW_H
mainwindow.cpp
实例化对象并且设置位置
kse=new QKeySequenceEdit(this);
kse->setGeometry(400,530,200,30);
实现信号与槽函数,使得输入快捷键执行对应的功能。
connect(kse,SIGNAL(keySequenceChanged(const QKeySequence &)),this,SLOT(changed(const QKeySequence &)));
void MainWindow::changed(const QKeySequence &ks)
{
if(ks==QKeySequence(tr("Ctrl+Q"))) this->close();
else qDebug()<
关闭窗口
此属性包含当前选择的键序列。
快捷方式可以由用户更改,也可以通过 setter 功能更改。