There's no doubt that Bitcoin is wonderfully convenient for online transactions; it's fast, easy, and convenient. However, physical transactions involving BTC have always been a bit messier: how do you physically send digital money to someone with whom you're interacting face-to-face?
There have been a few attempts to find solutions to this problem.
The most low-tech method has been the static QR code, on display near the point of sale: the purchaser simply scans the vendor's QR code, sends the funds, and the transaction is complete. Pretty straight-forward, but not without its problems: the vendor must manually check to ensure the funds have arrived; the funds from all transactions are being sent to the same address, which quickly becomes a disorganized mess for bookkeeping. Also, the purchaser must have a smartphone capable of sending BTC, which is not always the case (many people have issues with blockchain.info for iOS, for example).
Hardware wallets like the TREZOR offer security and convenience for the purchaser; private keys never leave the device, so unless you physically lose it, your funds are reasonably safe. However, they're inherently dangerous for the vendor, because they have to plug foreign USB devices into their POS all day. All it takes is one bogus device loaded with malware to permanently change a vendor's mind on accepting funds in this manner.
Paper wallets are another solution, but they're not convenient, nor are they particularly secure: the address QR and the private key QR are on the same piece of paper (or plastic, metal, etc), which means that your funds are at risk from the moment you reveal the private key to the moment you've either spent all the funds in the wallet, or someone else has spent them for you. The vendor doesn't particularly mind this method of payment, as he can immediately import and sweep the funds from the private key. However, unless the purchaser is spending the entire contents of the paper wallet, the issue turns into where the change should be sent -- you don't want it sent back to the address for which you've just revealed your private key.
So why don't we start doing things in a way that makes sense?
Why don't we make sweeping private keys the default way to conduct a face-to-face transaction?
Here's a few examples of how this would work:
Alice
Alice wants to go to a cafe for lunch. She knows that a coffee and a sandwich will cost 0.1 BTC. She creates a new wallet address, sends 0.1 BTC to it, and prints out the QR code for the private key. When she places her order, she hands the cashier her QR code. The cashier sweeps the funds from the key, and no change is necessary.
Bob
Bob wants to buy some new clothes at the mall. He is planning to visit several stores, and he doesn't know how much money he will spend at each store. He has a budget of 2 BTC for this shopping trip. Bob creates 10 new wallet addresses, sends 0.2 BTC to each, and prints a QR code for each private key. He then creates a "change" wallet address, and prints the QR for the public key only.
Bob visits his first store and purchases a pair of sunglasses for 0.15 BTC. He provides the cashier with a QR code for 0.2 BTC, which is swept; he then provides the QR code for his change address, to which the cashier sends his change, 0.05 BTC.
Bob then visits another shop, and selects a pair of pants that cost 0.45 BTC. He presents the cashier with three QR codes for 0.2 BTC each, and then presents the QR for his change address. The cashier sweeps 0.6 BTC from the three keys, and sends 0.15 BTC to the change address.
Cathy
Cathy also wants to go to the mall to buy a television, earrings, and some lunch. She isn't sure how much money the earrings and lunch will cost, and she doesn't want to send a large amount of her money to a change address back home. She creates one wallet address with 3 BTC that she will use to buy her television, and creates several extra wallet addresses for her smaller purchases: some loaded with 0.05 BTC and others loaded with 0.01 BTC. This way, she can let the cashier sweep the funds without having to send too much change back home.
Dave
Dave wants to purchase 3 BTC worth of gifts for his wife. He creates ten wallet addresses, and loads the first with 3 BTC. He then transfers the QR codes for both the public and private keys to a smartphone app that can display them at will. He makes his first purchase by presenting the QR code for the private key with 3 BTC; he presents the public key of his next address in order to receive his change. With each subsequent purchase, he presents the QR for the private key that currently holds the balance of the funds, the cashier sweeps the funds, and Dave receives his change to an address of his choosing. As long as he has created enough addresses to cover all of his purchases, he can continue doing this until all of his money is spent.
Such a smartphone app would be trivial to create; it needn't even be specific to Bitcoin. This is handy for iOS users, as Apple disallows Bitcoin wallet apps, but obviously cannot ban an app that only displays QR codes. Users could create QR codes using bitaddress.org or a tool of their choice; importing the codes to a phone is as easy as capturing each one with the phone's camera.
I'm sure there are many, many other usage scenarios beyond the four presented here; I'm also having a difficult time finding any drawbacks in this system. Discussion is welcome!