文中控件有:QLineEdit测试,QComboBox测试,QTableWidget测试,QTreeWidget测试
话不多说,直接上代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
QStringList lineList;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i = 0;i < 4;i++){
for(int j = 0;j < 4;j++){/* item不为空实验效果更直观 */
ui->tableWidget->setItem(i,j,new QTableWidgetItem(""));
}
}
int topCount = ui->treeWidget->topLevelItemCount();
if(topCount <= 0){
qDebug() << "current tree item 0";
}
for (int i = 0; i < topCount; i++) {/* QTreeWidgetItem默认不可编辑,设置为可编辑 */
QTreeWidgetItem *item = ui->treeWidget->topLevelItem(i);
for(int j = 0;j < item->childCount();j++){
item->child(j)->setFlags(item->flags()|Qt::ItemIsEditable);
}
}
lineList << "2020-1-1" << "2019-2-3" << "1080-3-4" << "998-999-1";
/* 新建一个公用的completer */
completer = new QCompleter(lineList, this);
/* CaseInsensitive不区分大小写/CaseSensitive区分大小写 */
completer->setCaseSensitivity(Qt::CaseInsensitive);
/* PopupCompletion符合值弹出一个窗口
* InlineCompletion符合值会直接内嵌到文本输入框中
* UnfilteredPopupCompletion所有的筛选条件都列出,符合条件的在最前
*/
completer->setCompletionMode(QCompleter::PopupCompletion);
/* 最大显示符合条件的个数 */
completer->setMaxVisibleItems(10);
// /* 补全路径 */
// QFileSystemModel *model = new QFileSystemModel;
// model->setRootPath(QDir::currentPath());
// completer->setModel(model);
// /* 日期,时间,ip,等等一大堆 */
QLineEditCompleterInit();
QComboxBoxCompleterInit();
}
MainWindow::~MainWindow()
{
delete ui;
}
/* QLineEdit测试 */
void MainWindow::QLineEditCompleterInit()
{
ui->lineEdit->setCompleter(completer);
}
/* 关联此信号槽,编辑结束,收到回车键或者光标变换,lineEdit自带的信号与槽 */
void MainWindow::on_lineEdit_editingFinished()
{
/* 动态添加completer数据 */
QCompleter *completer = ui->lineEdit->completer();
if(!ui->lineEdit->text().isEmpty()){
lineList << ui->lineEdit->text();
completer->setModel(new QStringListModel(lineList, this));
}
}
/* QComboBox测试 */
void MainWindow::QComboxBoxCompleterInit()
{
ui->comboBox->setEditable(true);
ui->comboBox->setCompleter(completer);
}
/* QTableWidget测试 QTableWidget自带的信号与槽 */
void MainWindow::on_tableWidget_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
{
int row = 0,column = 0;
QString text;
QWidget *pWidget;
if(current != nullptr){
row = current->row();
column = current->column();
/* 获取需要编辑的item的当前文本 */
text = ui->tableWidget->item(row,column)->text();
QLineEdit *myLineEdit=new QLineEdit;
myLineEdit->setCompleter(completer);
myLineEdit->setText(text);
/* 将编辑框设置为单元格的显示小部件,编辑框不需要delete,小部件被remove时会自动回收 */
ui->tableWidget->setCellWidget(row,column,myLineEdit);
}
if(previous != nullptr){
row = previous->row();
column = previous->column();
/* 获取当前文本内容 */
pWidget = ui->tableWidget->cellWidget(row,column);
text = static_cast<QLineEdit*>(pWidget)->text();
/* 移除小部件 */
ui->tableWidget->removeCellWidget(row,column);
/* 将输入内容设置到item中 */
ui->tableWidget->setItem(row,column,new QTableWidgetItem(text));
}
}
/* QTreeWidget测试 QTreeWidget自带的信号与槽 */
void MainWindow::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
Q_UNUSED(current);
/* 目的:移除小部件QLineEdit */
QString text;
if(previous != nullptr){ /* 上一个item不为空 */
if( previous->parent() == nullptr)/* 上一个item不是顶层节点 */
return;
QLineEdit * curLine = static_cast<QLineEdit *>(ui->treeWidget->itemWidget(previous,priColumn));
if(curLine != nullptr){
/* 获取小部件内容 */
text = curLine->text();
/* 移除小部件 */
ui->treeWidget->removeItemWidget(previous,priColumn);
/* 将输入的内容设置到item*/
previous->setText(priColumn,text);
}
}
}
void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
{
if(item->parent() != nullptr){
/* 用于设置小部件,因为itemChanged获取不到子节点的当前列 */
priColumn = column;
QLineEdit *myLineEdit=new QLineEdit;
myLineEdit->setCompleter(completer);
myLineEdit->setText(item->text(column));
/* 将需要编辑的设置小部件QLineEdit */
ui->treeWidget->setItemWidget(item,column,myLineEdit);
}
}
其中下载:https://download.csdn.net/download/qq_41399894/12260465
其实还有很多小控件可以做,
而且你们还可以将QCompleter的筛选条件从文件中导入,可以从数据库中搜索
下载:https://download.csdn.net/download/qq_41399894/12260458