I fixed this problem.
I used 2 signal&slots. One for non checkable action and second for checkable. The second one have menu->show() in slot to keep menu on top.
void QSpreadsheetHeaderView
::mousePressEvent ( QMouseEvent * event
) {
logicalIndex = logicalIndexAt(event->pos());
if (buttonMenuRect(logicalIndex).contains(event->pos())) {
if(set_checkbox==false)
{
sortAZ = menu->addAction("Sortuj A->Z");
sortZA = menu->addAction("Sortuj Z->A");
clear_sort = menu->addAction("Anuluj");
menu->addSeparator();
hideCol = menu->addAction("Ukryj kolumnÄ™");
clear_hideCol = menu->addAction("Odkryj wszystkie");
for(int i = 0; i <model()->columnCount(); i++)
{
actions[i] = menu->addAction(model()->headerData(i, Qt::Horizontal).toString());
actions[i]->setCheckable(true);
connect(actions[i],SIGNAL(triggered(bool)),this,SLOT(hide_selected_column(bool)));
if(i<columns_min)actions[i]->setChecked(true);
}
set_checkbox=true;
connect(menu,
SIGNAL(triggered
(QAction*)),
this,
SLOT(action
(QAction*)));
}
// Disable hide column if only one column remains. Otherwise
// the gui is no more available to show them back.
hideCol->setEnabled(hiddenSectionCount() < count() - 1);
if(hideCol->isEnabled()==false)
{
for(int i = 0; i <model()->columnCount(); i++)
{
if(actions[i]->isChecked()==true)
{
previous_sender=actions[i];
freeze=true;
actions[i]->setEnabled(false);
break;
}
}
}
menu->popup(mapToGlobal(event->pos()));
}
// Catch previous arrow mouse click.
else if (prevRect(logicalIndex).contains(event->pos()) && set_checkbox==true) {
showSection(logicalIndex - 1);
actions[logicalIndex - 1]->setChecked(true);
updateSection(logicalIndex - 2);
if(freeze==true) { previous_sender->setEnabled(true); freeze=false;}
}
// Catch next arrow mouse click.
else if (nextRect(logicalIndex).contains(event->pos()) && set_checkbox==true) {
showSection(logicalIndex + 1);
actions[logicalIndex + 1]->setChecked(true);
updateSection(logicalIndex + 2);
if(freeze==true) { previous_sender->setEnabled(true); freeze=false; }
}
}
void QSpreadsheetHeaderView::mousePressEvent ( QMouseEvent * event )
{
QHeaderView::mousePressEvent(event);
logicalIndex = logicalIndexAt(event->pos());
if (buttonMenuRect(logicalIndex).contains(event->pos())) {
if(set_checkbox==false)
{
menu = new QMenu(this);
sortAZ = menu->addAction("Sortuj A->Z");
sortZA = menu->addAction("Sortuj Z->A");
clear_sort = menu->addAction("Anuluj");
menu->addSeparator();
hideCol = menu->addAction("Ukryj kolumnÄ™");
clear_hideCol = menu->addAction("Odkryj wszystkie");
for(int i = 0; i <model()->columnCount(); i++)
{
actions[i] = new QAction(menu);
actions[i] = menu->addAction(model()->headerData(i, Qt::Horizontal).toString());
actions[i]->setCheckable(true);
connect(actions[i],SIGNAL(triggered(bool)),this,SLOT(hide_selected_column(bool)));
if(i<columns_min)actions[i]->setChecked(true);
}
set_checkbox=true;
connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(action(QAction*)));
}
// Disable hide column if only one column remains. Otherwise
// the gui is no more available to show them back.
hideCol->setEnabled(hiddenSectionCount() < count() - 1);
if(hideCol->isEnabled()==false)
{
for(int i = 0; i <model()->columnCount(); i++)
{
if(actions[i]->isChecked()==true)
{
previous_sender=actions[i];
freeze=true;
actions[i]->setEnabled(false);
break;
}
}
}
menu->popup(mapToGlobal(event->pos()));
}
// Catch previous arrow mouse click.
else if (prevRect(logicalIndex).contains(event->pos()) && set_checkbox==true) {
showSection(logicalIndex - 1);
actions[logicalIndex - 1]->setChecked(true);
updateSection(logicalIndex - 2);
if(freeze==true) { previous_sender->setEnabled(true); freeze=false;}
}
// Catch next arrow mouse click.
else if (nextRect(logicalIndex).contains(event->pos()) && set_checkbox==true) {
showSection(logicalIndex + 1);
actions[logicalIndex + 1]->setChecked(true);
updateSection(logicalIndex + 2);
if(freeze==true) { previous_sender->setEnabled(true); freeze=false; }
}
}
To copy to clipboard, switch view to plain text mode
Slot for non checkable:
void QSpreadsheetHeaderView
::action(QAction *action
) {
if (action == hideCol)
{
hideSection(logicalIndex);
actions[logicalIndex]->setChecked(false);
updateSection(logicalIndex-1);
}
if (action == sortAZ)
model()->sort(logicalIndex, Qt::AscendingOrder);
if (action == sortZA)
model()->sort(logicalIndex, Qt::DescendingOrder);
if (action == clear_hideCol){
for(int i = 0; i <model()->columnCount(); i++)
{
showSection(i);
actions[i]->setChecked(true);
actions[i]->setEnabled(true);
if(freeze==true) { previous_sender->setEnabled(true); freeze=false;}
}
}
if (action == clear_sort){
}
}
void QSpreadsheetHeaderView::action(QAction *action) {
if (action == hideCol)
{
hideSection(logicalIndex);
actions[logicalIndex]->setChecked(false);
updateSection(logicalIndex-1);
}
if (action == sortAZ)
model()->sort(logicalIndex, Qt::AscendingOrder);
if (action == sortZA)
model()->sort(logicalIndex, Qt::DescendingOrder);
if (action == clear_hideCol){
for(int i = 0; i <model()->columnCount(); i++)
{
showSection(i);
actions[i]->setChecked(true);
actions[i]->setEnabled(true);
if(freeze==true) { previous_sender->setEnabled(true); freeze=false;}
}
}
if (action == clear_sort){
}
}
To copy to clipboard, switch view to plain text mode
and checkable:
void QSpreadsheetHeaderView::hide_selected_column(bool checked)
{
menu->show();
QAction * senderCHECK
= qobject_cast<QAction
*>
(this
->sender
());
for(int i=0;i<23;i++)
{
if(senderCHECK==actions[i])
{
if(checked==false && freeze==false)
{
hideSection(i);
actions[i]->setChecked(false);
}
else if(checked==true && freeze==true)
{
hideCol->setEnabled(true);
previous_sender->setEnabled(true);
showSection(i);
actions[i]->setChecked(true);
freeze=false;
}
else if(checked==true)
{
showSection(i);
actions[i]->setChecked(true);
}
}
}
if(count()-hiddenSectionCount()==1)
{
freeze=true;
hideCol->setEnabled(false);
for(int i=0;i<23;i++)
{
if(actions[i]->isChecked()==true)
{
previous_sender=actions[i];
actions[i]->setEnabled(false);
break;
}
}
}
}
void QSpreadsheetHeaderView::hide_selected_column(bool checked)
{
menu->show();
QAction * senderCHECK = qobject_cast<QAction *>(this->sender());
for(int i=0;i<23;i++)
{
if(senderCHECK==actions[i])
{
if(checked==false && freeze==false)
{
hideSection(i);
actions[i]->setChecked(false);
}
else if(checked==true && freeze==true)
{
hideCol->setEnabled(true);
previous_sender->setEnabled(true);
showSection(i);
actions[i]->setChecked(true);
freeze=false;
}
else if(checked==true)
{
showSection(i);
actions[i]->setChecked(true);
}
}
}
if(count()-hiddenSectionCount()==1)
{
freeze=true;
hideCol->setEnabled(false);
for(int i=0;i<23;i++)
{
if(actions[i]->isChecked()==true)
{
previous_sender=actions[i];
actions[i]->setEnabled(false);
break;
}
}
}
}
To copy to clipboard, switch view to plain text mode
Bookmarks