def do_open_channel(self, funding_tx, conn_str, password):
        """
        conn_str: a connection string that extract_nodeid can parse, i.e. cannot be a trampoline name
        """
        self._logger.debug('opening channel')
        # read funding_sat from tx; converts '!' to int value
        funding_sat = funding_tx.output_value_for_address(DummyAddress.CHANNEL)
        lnworker = self._wallet.wallet.lnworker

        def open_thread():
            error = None
            try:
                chan, _funding_tx = lnworker.open_channel(
                    connect_str=conn_str,
                    funding_tx=funding_tx,
                    funding_sat=funding_sat,
                    push_amt_sat=0,
                    password=password)
                self._logger.debug('opening channel succeeded')
                self.channelOpenSuccess.emit(chan.channel_id.hex(), chan.has_onchain_backup(),
                                             chan.constraints.funding_txn_minimum_depth, funding_tx.is_complete())

                # TODO: handle incomplete TX
                # if not funding_tx.is_complete():
                #     self._txdetails = QETxDetails(self)
                #     self._txdetails.rawTx = funding_tx
                #     self._txdetails.wallet = self._wallet
                #     self.txDetailsChanged.emit()

            except (CancelledError, TimeoutError):
                error = _('Could not connect to channel peer')
            except Exception as e:
                error = str(e)
                if not error:
                    error = repr(e)
            finally:
                if error:
                    self._logger.exception("Problem opening channel: %s", error)
                    self.channelOpenError.emit(error)

        self._logger.debug('starting open thread')
        self.channelOpening.emit(conn_str)
        threading.Thread(target=open_thread, daemon=True).start()

        conn_str: a connection string that extract_nodeid can parse, i.e. cannot be a trampoline name
        
electrum/gui/qml/qechannelopener.py