Kirsche
28-10-2005, 15:14
Hallo Leute,
ich habe ein Problem beim Benutzen eines Popupmenüs. Es öffnet sich bei einem Rechtsklick, ist also ein Kontextmenü. Das Problem besteht darin, dass ich Häkchen setzen möchte und außerdem noch nicht bekannt ist, wie viele Einträge das Menü haben wird. Das Kontextmenü gehört zu einer Tabelle und soll Tabellenspalten ein- bzw. ausblenden, je nachdem ob das Häkchen gesetzt wird oder nicht. Das Menü "showHideMenu" befindet sich als Unterpunkt im eigentlichen Kontextmenü "contextMenu".
Ich habe zwei Ansätze, die jeweils ein eigenes Problem haben. Außerdem stürzt das Programm anschließend in beiden Fällen ab, statt die Spalten auszublenden.
1. Ansatz: "mit insertItem"
QPopupMenu* showHideMenu = new QPopupMenu( contextMenu );
showHideMenu->setCheckable( true );
QString label;
for( int i = 0; i < table->numCols(); i++ )
{
label = table->horizontalHeader()->label( i );
showHideMenu->insertItem( label, i ,i );
showHideMenu->setItemChecked( i, true );
}
connect( showHideMenu, SIGNAL( activated( int ) ), SLOT( slotShowHideColumn( int ) ) );
contextMenu->insertItem(tr("&Show/Hide Columns"), showHideMenu);
Hier ist das Problem, dass die Häkchen sich nicht umsetzen lassen. Allerdings wird eine gültige Id gesendet.
2. Ansatz:
QPopupMenu* showHideMenu = new QPopupMenu( contextMenu );
QString label;
QAction* showHideAction;
QString label;
for( int i = 0; i < table->numCols(); i++ )
{
label = table->horizontalHeader()->label( i );
showHideAction = new QAction( label, label, showHideMenu );
showHideAction->setToggleAction( true );
showHideAction->setOn( true );
showHideAction->addTo( showHideMenu );
connect( showHideAction, SIGNAL( toggled( bool ) ), showHideAction, SLOT( setOn( bool ) ) );
}
connect( showHideMenu, SIGNAL( activated( int ) ), SLOT( slotShowHideColumn( int ) ) );
contextMenu->insertItem(tr("&Show/Hide Columns"), showHideMenu);
Hier ist das Problem, dass ich keine Id für die Items setzen kann. Dadurch wird immer -69 als Id gesendet. Damit kann ich natürlich nichts anfangen. Dafür wird das Häkchen richtig umgesetzt.
Ich brauche die Id, um die richtige Spalte in der Tabelle ein- oder auszublenden. Ich weiß schließlich vorher nicht, wie viele Spalten die Tabelle haben wird. Ich muss dazu außerdem abtesten, ob das Häkchen gesetzt ist oder nicht.
void MyWidget::slotShowHideColumn( int id )
{
for( int i = 0; i < table->numCols(); i++ )
{
if( showHideMenu->isItemChecked( id ) == true )
{
table->hideColumn( id );
}
else
{
table->showColumn( id );
}
}
}
Dabei stürzt das Programm immer ab, auch wenn eine gültige Id übertragen wurde. Ich habe "showHideMenu" als Membervariable, also müsste sie noch vorhanden sein. Oder wurde das Kontextmenü doch zerstört und ist nun ungültig? Ich führe es mit "exec( pos )" aus. :confused:
Ich wäre auch für jede andere Variante dankbar, um die Spalten ein- und ausblenden zu können.
Vielen Dank,
Kirstin
ich habe ein Problem beim Benutzen eines Popupmenüs. Es öffnet sich bei einem Rechtsklick, ist also ein Kontextmenü. Das Problem besteht darin, dass ich Häkchen setzen möchte und außerdem noch nicht bekannt ist, wie viele Einträge das Menü haben wird. Das Kontextmenü gehört zu einer Tabelle und soll Tabellenspalten ein- bzw. ausblenden, je nachdem ob das Häkchen gesetzt wird oder nicht. Das Menü "showHideMenu" befindet sich als Unterpunkt im eigentlichen Kontextmenü "contextMenu".
Ich habe zwei Ansätze, die jeweils ein eigenes Problem haben. Außerdem stürzt das Programm anschließend in beiden Fällen ab, statt die Spalten auszublenden.
1. Ansatz: "mit insertItem"
QPopupMenu* showHideMenu = new QPopupMenu( contextMenu );
showHideMenu->setCheckable( true );
QString label;
for( int i = 0; i < table->numCols(); i++ )
{
label = table->horizontalHeader()->label( i );
showHideMenu->insertItem( label, i ,i );
showHideMenu->setItemChecked( i, true );
}
connect( showHideMenu, SIGNAL( activated( int ) ), SLOT( slotShowHideColumn( int ) ) );
contextMenu->insertItem(tr("&Show/Hide Columns"), showHideMenu);
Hier ist das Problem, dass die Häkchen sich nicht umsetzen lassen. Allerdings wird eine gültige Id gesendet.
2. Ansatz:
QPopupMenu* showHideMenu = new QPopupMenu( contextMenu );
QString label;
QAction* showHideAction;
QString label;
for( int i = 0; i < table->numCols(); i++ )
{
label = table->horizontalHeader()->label( i );
showHideAction = new QAction( label, label, showHideMenu );
showHideAction->setToggleAction( true );
showHideAction->setOn( true );
showHideAction->addTo( showHideMenu );
connect( showHideAction, SIGNAL( toggled( bool ) ), showHideAction, SLOT( setOn( bool ) ) );
}
connect( showHideMenu, SIGNAL( activated( int ) ), SLOT( slotShowHideColumn( int ) ) );
contextMenu->insertItem(tr("&Show/Hide Columns"), showHideMenu);
Hier ist das Problem, dass ich keine Id für die Items setzen kann. Dadurch wird immer -69 als Id gesendet. Damit kann ich natürlich nichts anfangen. Dafür wird das Häkchen richtig umgesetzt.
Ich brauche die Id, um die richtige Spalte in der Tabelle ein- oder auszublenden. Ich weiß schließlich vorher nicht, wie viele Spalten die Tabelle haben wird. Ich muss dazu außerdem abtesten, ob das Häkchen gesetzt ist oder nicht.
void MyWidget::slotShowHideColumn( int id )
{
for( int i = 0; i < table->numCols(); i++ )
{
if( showHideMenu->isItemChecked( id ) == true )
{
table->hideColumn( id );
}
else
{
table->showColumn( id );
}
}
}
Dabei stürzt das Programm immer ab, auch wenn eine gültige Id übertragen wurde. Ich habe "showHideMenu" als Membervariable, also müsste sie noch vorhanden sein. Oder wurde das Kontextmenü doch zerstört und ist nun ungültig? Ich führe es mit "exec( pos )" aus. :confused:
Ich wäre auch für jede andere Variante dankbar, um die Spalten ein- und ausblenden zu können.
Vielen Dank,
Kirstin