bitcoind is a Bitcoin service daemon, which is a program that runs in the background and with which a user can't usually interact directly during it's runtime. This is a full node server that downloads that creates a P2P network and synchronizes the blockchain and verifies transactions and blocks.
bitcoin-cli is a command-line interface for Bitcoin Core client that connects to a running instance of bitcoind daemon. User can interact with this program and do any necessary functions with it that will control the bitcoind service as well as the possibility of using a Bitcoin wallet to send and receive funds, among other functions that Bitcoin Core client provides.
bitcoin-qt is a program that, unlike bitcoind and blitcoin-cli, has a graphical environment. It acts as both bitcoind and bitcoin-cli, as it is running a full node service while providing a user with a graphical environment to control that service, as well as other wallet and non-wallet functions. It also provides a regular command-line interface when you go to Help->Debug window->Console.