This existing answer should help further detail the explanation and code provided below.
The complex baseband signal is simply the IFFT; recreating the time domain waveform from the baseband values. So each bin in the FFT represents the complex value for the individual frequency "sub-carrier" represented by that FFT bin.
For each FFT frame of N sub-carriers, load in the N complex values for each of the N QPSK symbols within that FFT frame, which will have a time duration corresponding to the time interval for the resulting Inverse FFT. Then on the next frame, load all the next symbols (based on the data desired to be transmitted) and append the resulting Inverse FFT for that next frame at the end of the previous etc (assuming as the OP has stated that we are ignoring the additional Cyclic Prefix).
Below is a simple Python example of this that I had previously done to confirm the carrier offset computations I provided for this other post, in this case using $N=8$. The four symbols labeled "0", "1", "2", "3", correspond to the possible combinations for two bits of data, depending on how a binary data pattern is mapped to those symbols (see Gray-coding for QPSK at this link). Thus the sequence [0, 1, 2, 0, 2, 3, 0, 1] corresponds to some 16 bit sequence of binary data.
The result tx
is the 8 time domain samples resulting from the parallel transmission of the 8 closely spaced individual QPSK waveforms. Note how each of the symbols is thus sampled at 8 samples/symbol.
# map ofdm symbols to QPSK constellation
# here is an example short sequence
# where 0 is Q1, 1 Q2, 2 Q3 and 3 Q4
symmap = {0: 1 + 1j,
1 : 1 - 1j,
3 : -1 - 1j,
2 : -1 + 1j}
tx_symb = [0, 1, 2, 0, 2, 3, 0, 1]
# inverse FFT for tx sequence
txfft = [symmap[i] for i in tx_symb]
tx = fft.ifft(txfft)
# recovering rx in the receiver
rx1 = fft.fft(tx)
I hope the following additional graphics clear up any residual confusion:
Above we see the processing of three successive OFDM symbols in time (where an "OFDM Symbol" corresponds to a complete FFT frame). Each OFDM symbol contains 4 sub-carriers each with QPSK modulation, with the red dots indicating possible locations for any given transmission. For the first sub-carrier I have specifically indicated that we are transmitting "S1" for first sub-carrier in the first OFDM symbol, then "S2" for this same sub-carrier in the next OFDM symbol, then "S3" for this same sub-carrier in the third OFDM symbol. The time duration for "S1", "S2" and "S3" is the time duration of the FFT frame. Given with the FFT that we have the same number of samples in time and in frequency, then the four samples in the FFT correspond to four samples in time, and the duration will be given by the sampling rate for those samples. If for example we wanted a QPSK symbol duration to be 1 ms, then that means we have to have a sampling rate of 4 samples per ms or 4 KHz: We need to load the FFT at this rate in order to keep up with a transmitted output consistent with a 1 ms QPSK symbol duration.
This is further detailed in the plot below showing the resulting IFFT outputs and the first sub-carrier's contribution to the resulting IFFT (which would be the sum of all the modulated sub-carriers in the time domain).