Lots of different questions here, you might have been better off asking this in 2 or 3 separate posts, but let's see what happens...
1) "the world" I guess is a relative term. I wouldn't give a pointer value to "the world", but based on your example, I'd say go ahead because I wouldn't consider a container of a widget to be "the world". On the other hand, if you created a set of objects based on external client request and then instead of unique identifiers, directly used pointers as the identifiers, that would be giving a pointer to internal memory to the world. I'd avoid doing that.
2) I would consider objects (or widgets) containing pointers to other objects (or widgets) to automatically be bad design. You obviously want to keep things as loosely coupled as possible but I can see some situations, where this would be acceptable. Loosely coupled simply means you want each of your objects (or widgets) to only know as much about the others as absolutely necessary (and not make any assumptions about internal implementations)
3) I've done numerous designs where you have a parent container and a set of children. One thing that I always try to do is avoid circular dependencies where object A knows about B and B knows about A. Typically when you do that, you are asking for trouble. Instead I would define a child (our widget class) and next to it define "IWidgetOwner" or "IWidgetKeeper" (ghostbusters reference) interface. Then have the parent implement this interface and pass a pointer to every child. Now you have a very clear hierarchical relationship. Your container knows about widgets that it contains, but widgets know nothing about your specific container. Instead, they can be placed in just about any container that implements your "keeper" interface.
4) Having said all this, if you are doing UI specific work, I would stay away from adding too much business logic inside the GUI controls (widgets) themselves. Instead, I would have a separate layer (class) that would setup subscriptions on the event handlers and define which action should be taken when certain events get fired. This way your widget code stays generic and reusable and all the business logic is wrapped up in a single place so when you do have to go change it, you don't need to look all over your code.
5) A button never "needs" to write a file. Instead, your application needs to write a file in response to a user click. I would always separate code that "does work" from UI as much as I can. Think of the scenario where you want a second button, or global hot key to write the same file? Or what if you want to add automation and you need to write the same file but with no GUI involved at all. When you start a project with a UI, start by defining a very clear line between your GUI and your work. It might seem like too much overhead, but it's just a mental exercise and after you do them a few times, it'll get much more natural so the overhead will almost disappear. But you'll be writing code which is more loosely coupled and better positioned for future expansion.