最近在写程序的时候发现一个问题,界面上的QTableView在点击右键想出现右键菜单的时候,同时把单击对应的槽函数执行了一遍,所以想把鼠标左键和右键进行一下区分,找了好多方法发现通过重写mousePressEvent的方法可以实现想达到的目的,话不多说,上代码
class TableView : public QTableView
{
Q_OBJECT
public:
TableView(QWidget *parent = 0);
~TableView();
signals:
void leftClicked(const QModelIndex &);//点击左键信号
void rightClicked(const QModelIndex &);//点击右键信号
protected:
void mousePressEvent(QMouseEvent *event);//函数重写
}
void TableView::mousePressEvent(QMoouseEvent * event)
{
setCurrentIndex(QModelIndex());//对当前索引的初始化,否则点击无效区域时会记录上一次的有效值
QTableView::mousePressEvent(event);
QModelIndex index = currentIndex();
if(index.row() < 0 && index.column() < 0)//如果点击表格空白处直接返回
return;
if (event->button() == Qt::LeftButton)//鼠标左键
{
emit leftClicked(index);
}
else//鼠标右键
emit rightClicked(index);
}
之后创建一个TableView的界面就可以使用了,如果界面用代码实现直接继承TableView就可以,如果通过设计器designer画的界面,那只需要promote提升为TableView类就可以了。
还没说完,于此类似的是之前使用QSortFilterProxyModel来实现点击表头对表格TableView内的数据进行排序的功能,但是因为需要保留小数位所以在Model的data里面直接通过QString::number(num,'f',2);来显示的,这样就会造成界面上显示的是小数,但点击表头排序的时候却是使用字符串的格式进行排序的,所以同样还是通过函数重写来实现,代码如下:
bool SortFilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
QVariant leftData = sourceModel()->data(left);
QVariant rightData = sourceModel()->data(right);
if (leftData.type() == QVariant::String)//QString类型
{
if(leftData.toString().contains("."))
{
if (leftData.toDouble() < rightData.toDouble())
return true;
else
return false;
}
if(leftData.toString().contains(QRegExp("[\\x4e00-\\x9fa5]+")))//字段中包含汉字
{
QString testLeft = Initials::GetFirstLetter(leftData.toByteArray().data()).c_str();
QString testRight = Initials::GetFirstLetter(rightData.toByteArray().data()).c_str();
return QString::compare(testLeft, testRight) < 0;
}
else
{
return QString::compare(leftData.toString(), rightData.toString()) < 0;
}
}
if (leftData.type() == QVariant::Int)//整型
{
if (leftData.toInt() < rightData.toInt())
return true;
else
return false;
}
if (leftData.type() == QVariant::Double)//double类型
{
if (leftData.toDouble() < rightData.toDouble())
return true;
else
return false;
}
return true;
}
希望对遇到相同问题的人能有所帮助,谢谢