今天闲着没事,又开始搞一下这上位机软件,感觉QT用起来还是比较有趣的。而且回头一看,用QT写的界面还这么丑是怎么回事?
根本不能忍好吗。问了一下项目BOSS有什么功能需要完善,然后顺便搞了点美化,就搞成下面这样了。(虽然还是很丑)
可以看到加入了查找标签、显示总数量的功能,还有下面的控件QTableWidget的标题栏有个小箭头,是点击标题栏进行排序的功能。很明显,这3个都是跟QTableWidget有关的操作,果断看帮助文件和查百度。
首先说显示总数量,很简单,一个QLabel加setText()函数搞定
//字符串里的%1对应参数.arg()
ui->TagCountLabel->setText(tr("接收标签总数量:%1").arg(TagAddrList.size()));
查找和排序这里花了一定时间,主要是对QTable Widget控件不熟悉。实现点击排序主要依靠QHeaderView中自带的sectionClicked(int)信号,和QTableWidget自带的SLOT: sortByColumn(int)),这2个查了好久才找到,然后把SIGNAL和SLOT连接起来就行了。
ui->TagTable->setSortingEnabled(true); //可排序
QHeaderView *TagHeader = ui->TagTable->horizontalHeader();
connect(TagHeader, SIGNAL(sectionClicked(int)), ui->TagTable, SLOT(sortByColumn(int)));
了解QTableWidget后查找也不难实现,按下按钮(触发clicked信号进入SLOT),从QLineEdit中提取字符,遍历表格的首列并比对字符串,即可查找到对应标签。这里比对使用了QString的contains函数,包含指定字符串即可匹配。还有一些搜索到结尾等等的处理就不细说了
void MainWindow::TagFind()
{
QString strFind = ui->FindLineEdit->text();
//没有输入
if(strFind.isEmpty())
{
QMessageBox::warning(this, tr("错误"), tr("请输入地址"));
return;
}
//遍历首列,从当前位置往下搜索,没选中默认为-1
int currentRow = ui->TagTable->currentRow();
int lastRow = currentRow;
for(int i=currentRow+1; i<TagAddrList.size(); i++)
{
if( ui->TagTable->item(i,0)->text().contains(strFind, Qt::CaseInsensitive) )
{
//找到标签,将其置为选中状态
ui->TagTable->setCurrentCell(i, QItemSelectionModel::Select);
lastRow = i;
return;
}
}
if(currentRow == -1)
{
//找不到标签
QMessageBox::warning(this, tr("查找结果"), tr("没有找到标签%1").arg(strFind));
}
else
{
//已找到最后一项
QMessageBox::warning(this, tr("查找结果"), tr("已搜索到结尾"));
ui->TagTable->setCu
tentCell(lastRow, QItemSelecionModel::Deselect);
}
}
实现硬性指标的功能后,就开始研究界面的美化了,这里用到了QSS样式表,真的很强大很好用,详细的有机会再说吧。。这里附上读取样式表的代码,qss文件已经加载到资源文件了能吧。。这里附上读取样式表的代码,qss文件已经加载到资源文件里了。
void MainWindow::LoadQss(const QString &FilePath)
{
//加载样式表
QString qss;
QFile qssFile(FilePath);
qssFile.open(QFile::ReadOnly);
if(qssFile.isOpen())
{
qss = qssFile.readAll();
this->setStyleSheet(qss);
qssFile.close();
}
}