Allow filtering of loops for all categories

I would recommend defining a query var to define your custom filters, and then pass the (sanitized) value of that query var to query_posts() (to alter the primary Loop, if that is your ojbective).

First (in functions.php), define your query var:

<?php
function wpse47974_queryvars( $qvars )
{
$qvars[] = 'wpse47974_filter';
return $qvars;
}
add_filter( 'query_vars', 'wpse47974_queryvars' );
?>

Next, in the template, query your query var. I’ll assume that you have a pre-defined set of filters, defined in an array, $wpse47974_valid_filters:

<?php
// Query Tag Filter
$wpse47974_filter="";
if ( isset( $wp_query->query_vars['wpse47974_filter'] ) && in_array( $wp_query->query_vars['wpse47974_filter'], $wpse47974_valid_filters ) ) {
    $wpse47974_filter = $wp_query->query_vars['wpse47974_filter'];
}
?>

Next (somewhere), you’ll need to define your query parameters based on your filter types. I leave this as an exercise for the OP; however, in the following code, these query parameters are represented by “$wpse47974_filter_args['key'] => 'value';“, and we add them to an array, here (in the template file):

<?php
// Define an empty array to hold our filter parameters.
// This needs to be an array, in order not to generate 
// errors later in the array_merge(), if no filter parameters
// are being applied to the default query
$wpse47974_filter_args = array();

// If our query var is set, apply the filter parameter
if ( '' != $wpse47974_filter  ) {
    $wpse47974_filter_args['key'] = 'value';
};    
?>

Next, still in the template file, merge the default query with our filter parameters above, to modify query_posts() (note: before outputting the Loop):

<?php
// Globalize $wp_query
global $wp_query;
// Merge the default query with our filter parameters
$wpse47974_query_posts_args = array_merge( $wp_query->query, $wpse47974_filter_args );
// Modify the default query
query_posts( $wpse47974_query_posts_args );
?>

Now, the primary loop query is modified as per your filter.

Edit

I forgot an important part: how to get the query vars into the URL!

In your template, where you have your filter links (or buttons, or whatever), I assume you have an HTML anchor. Set the href attribute as follows, using the add_query_arg() function:

<a href="https://wordpress.stackexchange.com/questions/47974/<?php echo add_query_arg( array("wpse47974_filter' => 'value' ) ); ?>">FILTER NAME</a>

Now, when you click the link, the page is reloaded, with your query var appended to the URL.